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

Kon*_*nev 90 .net c# xml-serialization

我有一个可序列化的类,我的类中的一个属性在Guidgetter中生成一个.该属性不实现setter,并在序列化期间忽略.为什么这样,我总是必须实现一个setter才能序列化我的属性.

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试实现一个空的setter并正确序列化.

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
        set {}
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

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

Jam*_*mes 55

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

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

  • DataContractSerializer还需要setter.这是一个限制,因为即使我们可能只将它用于一种类型的操作,比如反序列化,但声明需要同时用于两者,序列化过程在尝试序列化时不会知道如何处理值XML转化为对象. (8认同)
  • @ryadavilli标记为`[DataMember]`的任何东西都使用`DataContractSerializer`序列化(只读或不读取). (7认同)
  • 啊,终于找到了我困惑的根源.序列化不需要属性设置器.但是,如果属性没有setter,则XML不会反序列化为对象.在那里,功课完成了. (3认同)

Joh*_*ers 10

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

可以序列化的项目

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

Public read/write properties and fields of public classes.

Classes that implement ICollection or IEnumerable.
Run Code Online (Sandbox Code Playgroud)

注意:

Only collections are serialized, not public properties.
Run Code Online (Sandbox Code Playgroud)
XmlElement objects.

XmlNode objects.

DataSet objects.
Run Code Online (Sandbox Code Playgroud)

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


另外,IXmlSerializable

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

请参阅" IXmlSerializable接口 ".


Roh*_*ats 6

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

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

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}
Run Code Online (Sandbox Code Playgroud)