91 votes

Pourquoi sont des propriétés sans un setter pas sérialisé

J'ai une classe sérialisable et l'une des propriétés dans ma classe génère un Guid dans le getter. La propriété implémente pas de setter et ignore pendant la sérialisation. Pourquoi est-ce que et dois-je toujours mettre en œuvre un setter pour mon bien être sérialisé.

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
    }
}

J'ai essayé de mettre en œuvre un vide setter et c'est sérialisé correctement.

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
        set {}
    }
}

Mise à jour:

Pouvez-vous indiquer comment dois-je définir des propriétés dont les valeurs ne changent jamais ou ceux dont la valeur est générée à l'interne?

56voto

James Points 40024

C'est une limitation de l' XmlSerializer il n'a pas sérialiser des propriétés en lecture seule, ce que vous avez fait dans votre deuxième exemple est essentiellement le hack pour obtenir de sérialiser, cependant, il est inutile si vous en avez besoin pour désérialiser plus tard.

Sinon, vous pouvez passer à l'utilisation de DataContractSerializer, c'est plus souple.

10voto

John Saunders Points 118808

Voir "l'Introduction de la Sérialisation XML" dans la documentation MSDN. Entre autres choses, il dit:

Les Éléments Qui Peuvent Être Sérialisées

Les éléments suivants peuvent être sérialisés à l'aide de la classe XmlSerializer:

Public read/write properties and fields of public classes.

Classes that implement ICollection or IEnumerable.

Note:

Only collections are serialized, not public properties.
XmlElement objects.

XmlNode objects.

DataSet objects.

Voir aussi "Pourquoi XML-classe Sérialisable besoin d'un constructeur sans paramètre"


Aussi, IXmlSerializable

En plus des types ci-dessus qui peut être sérialisé en XML Sérialiseur, n'importe quel type qui implémente l'interface IXmlSerializable il est possible de sérialiser et désérialiser. En particulier, cela signifie que le XElement et XDocument types peuvent être sérialisés.

Voir "Interface IXmlSerializable".

6voto

Rohit Vats Points 36234

La Limitation de la XMLSerializer - Propriétés sans setter peut pas être sérialisé.

Mais vous pouvez utiliser DataContractSerializer de sérialiser private setter properties -

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}

2voto

edamon Points 21

si vous souhaitez avoir des setters, et ont l'objet sérialisable/deserializable, impliment ISerializable, et de créer un constructeur comme MyObject(SerializationInfo info, StreamingContext contexte). Un exemple se trouve ici.

0voto

Rui Jarimba Points 3243

La sérialisation attributs sont utilisés pour sérialiser et désérialiser des objets. XmlSerializer supposerons que vous n'avez pas besoin de sérialiser les biens qui n'ont pas de setter. Setter sera utilisé lors de la désérialisation d'une chaîne de caractères dans un objet, parce qu'une instance de l'objet doit être créé, puis le setter seront utilisées pour remplir la valeur de la propriété.

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