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

更新:

你能指出我应该如何定义值永远不会改变的属性或者内部生成值的属性?

Konstantin Dinev asked 2019-09-10T23:14:10Z
5个解决方案
52 votes

它是XmlSerializer的限制,它没有序列化只读属性,你在第二个例子中所做的基本上是让它序列化的黑客,但是,如果你需要它以后反序列化它是没用的。

或者你可以切换到使用DataContractSerializer,它更灵活。

James answered 2019-09-10T23:14:32Z
9 votes

请参阅MSDN文档中的“XML序列化简介”。 除其他外,它说:

可以序列化的项目

可以使用XmlSerializer类序列化以下项:

XmlElement objects.

XmlNode objects.

DataSet objects.

注意:

XmlElement objects.

XmlNode objects.

DataSet objects.
XmlElement objects.

XmlNode objects.

DataSet objects.

另请参阅“为什么XML-Serializable类需要无参数构造函数”


另外,IXmlSerializable

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

请参阅“IXmlSerializable接口”。

John Saunders answered 2019-09-10T23:15:47Z
6 votes

限制DataContractSerializer - 无setter的属性无法序列化。

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

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}
Rohit Vats answered 2019-09-10T23:16:17Z
2 votes

如果你想拥有私有的setter,并且让对象可序列化/反序列化,则可以使用ISerializable,并创建一个像MyObject(SerializationInfo info,StreamingContext context)这样的构造函数。 这里有一个例子。

edamon answered 2019-09-10T23:16:43Z
0 votes

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

Rui Jarimba answered 2019-09-10T23:17:08Z
translate from https://stackoverflow.com:/questions/13401192/why-are-properties-without-a-setter-not-serialized