为什么没有setter的属性没有序列化

时间:2012-11-15 15:51:41

标签: c# .net xml-serialization

我有一个可序列化的类,我的类中的一个属性在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 {}
    }
}

更新

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

5 个答案:

答案 0 :(得分:52)

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

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

答案 1 :(得分:9)

请参阅MSDN文档中的“Introducing XML Serialization”。除其他外,它说:

  

可以序列化的项目

     

可以使用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.

另请参阅“Why XML-Serializable class need a parameterless constructor


此外,IXmlSerializable

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

请参阅“IXmlSerializable Interface”。

答案 2 :(得分:6)

XMLSerializer的限制 - 没有setter的属性无法序列化。

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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