为什么没有setter的属性没有被序列化
我有一个可序列化的类,我的类中的一个属性在getter中生成一个Guid
。 该属性没有实现setter,并在序列化过程中被忽略。 为什么是这样,我是否必须执行一个setter才能使我的资产序列化。
[Serializable] public class Example { [XmlAttribute("id")] public string Id { get { return Guid.NewGuid().ToString(); } } }
我试着实现一个空setter,它正确序列化。
[Serializable] public class Example { [XmlAttribute("id")] public string Id { get { return Guid.NewGuid().ToString(); } set {} } }
更新 :
你能指出我应该如何定义其值不会改变的值或值是否在内部生成?
这是XmlSerializer
的一个限制,它不会序列化只读属性,你在第二个例子中所做的实质上就是让它序列化的黑客技术,但是如果你以后需要反序列化的话,这是无用的。
或者,您可以切换到使用DataContractSerializer ,它更灵活。
请参阅MSDN文档中的“ XML序列化简介 ”。 除其他外,它说:
可以序列化的项目
以下项目可以使用XmlSerializer类进行序列化:
Public read/write properties and fields of public classes. Classes that implement ICollection or IEnumerable.
注意:
Only collections are serialized, not public properties.
XmlElement objects. XmlNode objects. DataSet objects.
另请参阅“ 为什么XML-Serializable类需要无参数构造函数 ”
另外,IXmlSerializable
除了上面的XML序列化器可以序列化的types之外,任何实现IXmlSerializable接口的types都可以被序列化和反序列化。 特别是,这意味着XElement和XDocumenttypes可以被序列化。
请参阅“ IXmlSerializable接口 ”。
XMLSerializer
限制 – 无setter的属性不能被序列化。
但是你可以使用DataContractSerializer
来序列化private setter properties
–
[DataMember] public string Id { get { return Guid.NewGuid().ToString(); } private set {} }
如果你想有私人的setter,并有对象可序列化/反序列化,impriment ISerializable,并创build像MyObject(SerializationInfo信息,StreamingContext上下文)的构造函数。 在这里find一个例子 。
序列化属性用于序列化和反序列化对象。 XmlSerializer会假设你不需要序列化任何没有setter的属性。 将string反序列化为对象时,将使用Setter,因为需要创build对象的实例,然后使用setter来填充属性值。