112

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

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

我尝试实现一个空设置器,它被正确序列化。

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

更新

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

4

5 回答 5

64

这是XmlSerializer它不序列化只读属性的限制,您在第二个示例中所做的基本上是使其序列化的黑客行为,但是,如果您稍后需要它反序列化,它是无用的。

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

于 2012-11-15T15:53:06.253 回答
10

请参阅 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 Serializer 序列化的类型外,任何实现了 IXmlSerializable 接口的类型都可以进行序列化和反序列化。特别是,这意味着可以序列化 XElement 和 XDocument 类型。

请参阅“ IXmlSerializable 接口”。

于 2012-11-15T16:13:42.760 回答
6

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

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

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}
于 2012-11-15T16:05:00.750 回答
2

如果您想拥有私有设置器,并使对象可序列化/可反序列化,请实现 ISerializable,并创建像 MyObject(SerializationInfo info, StreamingContext context) 这样的构造函数。在这里可以找到一个示例。

于 2013-09-20T20:06:16.583 回答
0

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

于 2012-11-15T15:56:24.340 回答