为什么没有 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 {}
}
}

更新 :

您能指出我应该如何定义那些其值永远不变的属性或者那些其值是内部生成的属性吗?

83221 次浏览

It's a limitation of XmlSerializer it doesn't serialize read-only properties, what you have done in your second example is essentially the hack to get it to serialize, however, it's useless if you need it to deserialize later.

你也可以选择使用 DataContractSerializer,它更加灵活。

序列化属性用于序列化和反序列化对象。 XmlSerializer 将假定您不需要序列化任何没有 setter 的属性。 在将字符串反序列化为对象时,将使用 Setter,因为需要创建对象的实例,然后将使用 Setter 填充属性值。

限制 XMLSerializer-属性没有 setter 不能序列化。

但是你可以使用 DataContractSerializer序列化 private setter properties-

[DataMember]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
private set {}
}

请参阅 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 可序列化类需要无参数构造函数


另外,IXmlSerializer

除了可以由 XML Serializer 序列化的上述类型之外,实现 IXmlSerializer 接口的任何类型都可以被序列化和反序列化。特别是,这意味着可以序列化 XElement 和 XDocument 类型。

请看“ IXmlSerializer 接口”。

如果您希望拥有私有设置器,并且希望对象是可序列化/反序列化的,那么实现 ISerialable,并创建一个类似 MyObject 的构造函数(SerializationInfo info,StreamingContext 上下文)。这里有一个例子.