58 votes

Pourquoi ma propriété publique n'est-elle pas sérialisée par XmlSerializer?

C'est l'une j'ai lutté pour l'âge, donc je pensais que je serais document quelque part. (Toutes mes excuses pour poser et de répondre à une question.)

(C# .net 2.0) J'ai eu une classe qui a été sérialisé par XmlSerializer, j'ai ajouté une nouvelle propriété publique cependant, il n'était pas inclus dans la sortie XML.

Ce n'est pas mentionné dans les docs n'importe où j'ai pu trouver, mais les propriétés publiques doivent disposer d'un ensemble en tant que bien comme un être sérialisé! Je suppose que c'est parce qu'il suppose que si vous allez à sérialiser alors vous aurez envie de désérialiser à partir du même fichier, de sorte que seule sérialise les propriétés qui ont à la fois un jeu et un get.

91voto

Marc Gravell Points 482669

Comme mentionné précédemment, la plupart des propriétés doit avoir à la fois un getter et setter, la principale exception à cette règle est les listes d' - par exemple:

private readonly List<Foo> bar = new List<Foo>();
public List<Foo> Bar {get { return bar; } } // works fine

qui sera beau travail; toutefois, si XmlSerializer trouve un setter - il exige que c'est public et ce qui suit va pas travailler:

public List<Foo> Bar {get; private set;} // FAIL

D'autres raisons, il peut ne pas sérialiser:

  • il n'est pas publique avec get et set (ou est - readonly de champ)
  • il a un [DefaultValue] d'attribut, et c'est avec cette valeur
  • il a un public bool ShouldSerializeFoo() méthode qui a retourné false
  • il a un public bool FooSpecified {get;set;} propriété ou un champ retourné false
  • elle est marquée [XmlIgnore]
  • elle est marquée [Obsolete]

L'un de ces provoquera pas de sérialiser

7voto

Cheeso Points 87022

Le point sur getter + setter est présenté au 3ème paragraphe de la page " Introduction à la sérialisation XML ". C'est en fait dans une boîte d'appel. Ne peut pas le manquer!

Sérialisation Intro-to-XML

(s'amuser un peu trop avec Freeimagehosting.net)

5voto

JonSchn Points 28

si vous ne souhaitez pas implémenter les paramètres corrects (car vous ne voulez peut-être ni désérialiser ni modifier la valeur d'un objet), vous pouvez simplement utiliser des paramètres factices, comme ceci: set { } , de sorte que XMLSerializer fonctionne, mais rien ne se passe si vous utilisez le Setter ...

c'est à dire

 public string ID { get { return _item.ID.ToString(); } set { } }
 

5voto

anonymous Points 417

De plus, les propriétés qui renvoient null ne sont pas sérialisées!

1voto

Rory Points 13087

Comme dans la question: les propriétés publiques doivent avoir à la fois un get et un ensemble pour être sérialisées par XmlSerializer

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X