Tengo una clase serializable y una de las propiedades de mi clase genera un Guid
en el captador. La propiedad no implementa ningún 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 señalar cómo debo definir las propiedades cuyos valores nunca cambian o aquellas para las que el valor se genera internamente?
c#
.net
xml-serialization
Konstantin Dinev
fuente
fuente
[Serializable]
.Respuestas:
Es una limitación de
XmlSerializer
que no serializa propiedades de solo lectura, lo que ha hecho en su segundo ejemplo es esencialmente el truco para que se serialice, sin embargo, es inútil si necesita deserializarlo más tarde.Alternativamente, puede cambiar al uso de DataContractSerializer , es más flexible.
fuente
[DataMember]
se serializa usandoDataContractSerializer
(solo lectura o no).XmlSerializer
implementación, se basa en el método de establecimiento público.DataContractSerializer
es un poco más inteligente en ese sentido (probablemente usando la reflexión para establecer el campo detrás de escena).Consulte " Introducción a la serialización XML " en la documentación de MSDN. Entre otras cosas, dice:
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 XML Serializer, cualquier tipo que implemente la interfaz IXmlSerializable puede serializarse y deserializarse. En particular, esto significa que los tipos XElement y XDocument se pueden serializar.
Consulte " Interfaz IXmlSerializable ".
fuente
Limitación de
XMLSerializer
: las propiedades sin setter no se pueden serializar.Pero puede usar
DataContractSerializer
para serializarprivate setter properties
:fuente
si desea tener establecedores privados y que el objeto sea serializable / deserializable, implemente ISerializable y cree un constructor como MyObject (información de SerializationInfo, contexto StreamingContext). Aquí se encuentra un ejemplo .
fuente
Los atributos de serialización se utilizan para serializar y deserializar objetos. XmlSerializer asumirá que no necesita serializar ninguna propiedad que no tenga un setter. Setter se utilizará al deserializar una cadena en un objeto, porque es necesario crear una instancia del objeto y luego se utilizará el setter para completar el valor de la propiedad.
fuente