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 setter et est ignorée lors de la sérialisation. Pourquoi 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 {}
}
}
Mise à jour :
Pouvez-vous indiquer comment définir les propriétés dont les valeurs ne changent jamais ou celles dont la valeur est générée en interne?
c#
.net
xml-serialization
Konstantin Dinev
la source
la source
[Serializable]
.Réponses:
C'est une limitation du fait
XmlSerializer
qu'il 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 en avez besoin pour désérialiser plus tard.Vous pouvez également passer à l'utilisation de DataContractSerializer , c'est plus flexible.
la source
[DataMember]
est sérialisé en utilisantDataContractSerializer
(en lecture seule ou non).XmlSerializer
implémentation, ça s'appuie sur la méthode du setter public.DataContractSerializer
est un peu plus intelligent dans ce sens (en utilisant probablement la réflexion pour définir le champ dans les coulisses).Consultez « Présentation de la sérialisation XML » dans la documentation MSDN. Entre autres choses, il dit:
Consultez également " Pourquoi la classe XML-Serializable a besoin d'un constructeur sans paramètre "
Aussi, IXmlSerializable
En plus des types ci-dessus qui peuvent être sérialisés par le sérialiseur XML, tout type qui implémente l'interface IXmlSerializable peut être sérialisé et désérialisé. En particulier, cela signifie que les types XElement et XDocument peuvent être sérialisés.
Voir « Interface IXmlSerializable ».
la source
Limitation de
XMLSerializer
- Les propriétés sans setter ne peuvent pas être sérialisées.Mais vous pouvez utiliser
DataContractSerializer
pour sérialiserprivate setter properties
-la source
si vous voulez avoir des setters privés et que l'objet soit sérialisable / désérialisable, implémentez ISerializable et créez un constructeur comme MyObject (SerializationInfo info, contexte StreamingContext). Un exemple se trouve ici .
la source
Les attributs de sérialisation sont utilisés pour sérialiser et désérialiser des objets. XmlSerializer supposera que vous n'avez pas besoin de sérialiser une propriété qui n'a pas de setter. Setter sera utilisé lors de la désérialisation d'une chaîne dans un objet, car une instance de l'objet doit être créée, puis le setter sera utilisé pour remplir la valeur de la propriété.
la source