У меня есть сериализуемый класс, и одно из свойств в моем классе генерирует Guid
в получателе. Свойство не реализует сеттер и игнорируется во время сериализации. Почему это так, и всегда ли мне нужно реализовать сеттер, чтобы мое свойство было сериализовано.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
}
}
Я попытался реализовать пустой сеттер, и он правильно сериализовался.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
set {}
}
}
Обновление :
Можете ли вы указать, как мне определять свойства, значения которых никогда не меняются или значения которых генерируются внутри?
c#
.net
xml-serialization
Константин Динев
источник
источник
[Serializable]
.Ответы:
Это ограничение заключается в том,
XmlSerializer
что он не сериализует свойства, доступные только для чтения, то, что вы сделали во втором примере, по сути, является взломом, чтобы заставить его сериализоваться, однако это бесполезно, если вам понадобится десериализация позже.В качестве альтернативы вы можете переключиться на использование DataContractSerializer , это более гибко.
источник
[DataMember]
, сериализуется с использованиемDataContractSerializer
(только для чтения или нет).XmlSerializer
реализации, он полагается на метод общедоступного установщика.DataContractSerializer
в этом смысле немного умнее (возможно, с использованием отражения, чтобы установить поле за кулисами).См. « Введение в сериализацию XML » в документации MSDN. Среди прочего в нем говорится:
Также см. « Почему классу XML-Serializable нужен конструктор без параметров ».
Кроме того, IXmlSerializable
В дополнение к указанным выше типам, которые могут быть сериализованы с помощью сериализатора XML, любой тип, реализующий интерфейс IXmlSerializable, может быть сериализован и десериализован. В частности, это означает, что типы XElement и XDocument могут быть сериализованы.
См. « Интерфейс IXmlSerializable ».
источник
Ограничение
XMLSerializer
- свойства без сеттера не могут быть сериализованы.Но вы можете использовать
DataContractSerializer
для сериализацииprivate setter properties
-источник
если вы хотите иметь частные сеттеры и чтобы объект был сериализуемым / десериализуемым, внедрите ISerializable и создайте конструктор, такой как MyObject (информация SerializationInfo, контекст StreamingContext). Пример можно найти здесь .
источник
Атрибуты сериализации используются для сериализации и десериализации объектов. XmlSerializer предполагает, что вам не нужно сериализовать какое-либо свойство, у которого нет установщика. Установщик будет использоваться при десериализации строки в объект, потому что необходимо создать экземпляр объекта, а затем установщик будет использоваться для заполнения значения свойства.
источник