为什么没有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来填充属性值。