Eu tenho uma classe serializável e uma das propriedades da minha classe gera um Guid
no getter. A propriedade não implementa nenhum setter e é ignorada durante a serialização. Por que é isso e sempre tenho que implementar um setter para que minha propriedade seja serializada.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
}
}
Tentei implementar um setter vazio e ele foi serializado corretamente.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
set {}
}
}
Atualização :
Você pode apontar como devo definir propriedades cujos valores nunca mudam ou aqueles para os quais o valor é gerado internamente?
c#
.net
xml-serialization
Konstantin Dinev
fonte
fonte
[Serializable]
.Respostas:
É uma limitação de
XmlSerializer
não serializar propriedades somente leitura, o que você fez em seu segundo exemplo é essencialmente o hack para fazê-lo serializar, no entanto, é inútil se você precisar desserializar mais tarde.Alternativamente, você pode mudar para o DataContractSerializer , é mais flexível.
fonte
[DataMember]
serializada usandoDataContractSerializer
(somente leitura ou não).XmlSerializer
implementação, ele depende do método setter público.DataContractSerializer
é um pouco mais inteligente nesse sentido (provavelmente usando reflexão para definir o campo nos bastidores).Consulte " Introdução à serialização de XML " na documentação do MSDN. Entre outras coisas, diz:
Além disso, consulte " Por que a classe XML-Serializable precisa de um construtor sem parâmetros "
Além disso, IXmlSerializable
Além dos tipos acima, que podem ser serializados pelo XML Serializer, qualquer tipo que implemente a interface IXmlSerializable pode ser serializado e desserializado. Em particular, isso significa que os tipos XElement e XDocument podem ser serializados.
Consulte " Interface IXmlSerializable ".
fonte
Limitação de
XMLSerializer
- Propriedades sem configurador não podem ser serializadas.Mas você pode usar
DataContractSerializer
para serializarprivate setter properties
-fonte
se quiser ter configuradores privados e o objeto ser serializável / desserializável, implemente ISerializable e crie um construtor como MyObject (informações de SerializationInfo, contexto de StreamingContext). Um exemplo é encontrado aqui .
fonte
Os atributos de serialização são usados para serializar e desserializar objetos. XmlSerializer assumirá que você não precisa serializar qualquer propriedade que não tenha um setter. O setter será usado ao desserializar uma string em um objeto, porque uma instância do objeto precisa ser criada e, em seguida, o setter será usado para preencher o valor da propriedade.
fonte