web-dev-qa-db-fra.com

Pourquoi les propriétés sans setter ne sont-elles pas sérialisées?

J'ai une classe sérialisable et l'une des propriétés de ma classe génère un Guid dans le getter. La propriété n'implémente aucun séparateur et est ignorée lors de la sérialisation. Pourquoi est-ce et dois-je toujours implémenter un setter pour que ma propriété soit sérialisée.

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

J'ai essayé d'implémenter un setter vide et il a été sérialisé correctement.

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

Mettre à jour :

Pouvez-vous indiquer comment définir des propriétés dont les valeurs ne changent jamais ou pour lesquelles la valeur est générée en interne?

83
Konstantin Dinev

C'est une limitation de XmlSerializer, elle ne sérialise pas les propriétés en lecture seule. Ce que vous avez fait dans votre deuxième exemple est essentiellement le hack pour le faire sérialiser. Cependant, il est inutile si vous avez besoin de le désérialiser plus tard.

Sinon, vous pouvez utiliser DataContractSerializer , c'est plus flexible.

51
James

Voir " Introduction à la sérialisation XML " dans la documentation MSDN. Entre autres choses, il est écrit:

Articles pouvant être sérialisés

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.

Remarque:

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

XmlNode objects.

DataSet objects.

Voir aussi " Pourquoi la classe XML-Serializable nécessite un constructeur sans paramètre "


Aussi, IXmlSerializable

En plus des types ci-dessus pouvant être sérialisés par le sérialiseur XML, tout type implémentant l'interface IXmlSerializable peut être sérialisé et désérialisé. Cela signifie notamment que les types XElement et XDocument peuvent être sérialisés.

Voir " IXmlSerializable Interface ".

9
John Saunders

Limitation de XMLSerializer - Les propriétés sans séparateur ne peuvent pas être sérialisées.

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

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

si vous souhaitez avoir des paramètres privés et que l'objet soit sérialisable/désérialisable, implémentez ISerializable et créez un constructeur comme MyObject (informations SerializationInfo, contexte StreamingContext). Un exemple est trouvé ici .

2
edamon

Les attributs de sérialisation sont utilisés pour sérialiser et désérialiser des objets . XmlSerializer supposera qu'il n'est pas nécessaire de sérialiser une propriété qui n'a pas de setter. une instance de l'objet doit être créée, puis le séparateur sera utilisé pour renseigner la valeur de la propriété.

0
Rui Jarimba