¿Por qué las propiedades sin setter no están serializadas?

Tengo una clase serializable y una de las propiedades en mi clase genera un Guid en el getter. La propiedad no implementa setter y se ignora durante la serialización. ¿Por qué es eso y siempre tengo que implementar un setter para que mi propiedad sea serializada?

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

Intenté implementar un setter vacío y se serializó correctamente.

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

Actualización :

¿Puede indicarme cómo debo definir las propiedades cuyos valores nunca cambian o las que el valor para se genera internamente?

Es una limitación de XmlSerializer que no XmlSerializer propiedades de solo lectura, lo que ha hecho en su segundo ejemplo es esencialmente el truco para hacer que serialice, sin embargo, es inútil si necesita deserializarlo más tarde.

Alternativamente, puede cambiar a usar DataContractSerializer , es más flexible.

Consulte ” Introducción a la serialización XML ” en la documentación de MSDN. Entre otras cosas, dice:

Elementos que pueden ser serializados

Los siguientes elementos se pueden serializar utilizando la clase XmlSerializer:

 Public read/write properties and fields of public classes. Classes that implement ICollection or IEnumerable. 

Nota:

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

Además, consulte ” Por qué la clase XML-Serializable necesita un constructor sin parámetros ”


Además, IXmlSerializable

Además de los tipos anteriores que pueden ser serializados por el Serializador XML, cualquier tipo que implemente la interfaz IXmlSerializable se puede serializar y deserializar. En particular, esto significa que los tipos XElement y XDocument se pueden serializar.

Ver ” Interfaz IXmlSerializable “.

Limitación de XMLSerializer : las propiedades sin setter no se pueden serializar.

Pero puede usar DataContractSerializer para serializar private setter properties

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

si desea tener instaladores privados, y hacer que el objeto sea serializable / deserializable, implemente ISerializable y cree un constructor como MyObject (SerializationInfoInfo, StreamingContext context). Un ejemplo se encuentra aquí .

Los atributos de serialización se usan para serializar y deserializar objetos. XmlSerializer asumirá que no necesita serializar ninguna propiedad que no tenga un setter. Setter se usará cuando deserialice una cadena en un objeto, porque una instancia del objeto necesita ser creada y luego el setter se usará para poblar el valor de la propiedad.