【问题标题】:Setting the initial value of a property when using DataContractSerializer使用 DataContractSerializer 时设置属性的初始值
【发布时间】:2011-02-13 03:15:47
【问题描述】:

如果我使用DataContractSerializer 对类进行序列化和反序列化,如何控制未序列化的属性的初始值?

考虑下面的Person 类。它的数据协定设置为序列化FirstNameLastName 属性,但不序列化IsNew 属性。我希望 IsNew 初始化为 TRUE,无论新 Person 是作为新实例实例化还是从文件中反序列化。

这很容易通过构造函数来完成,但据我所知DataContractSerializer 不会调用构造函数,因为它们可能需要参数。

[DataContract(Name="Person")]
public class Person 
{
    [DataMember(Name="FirstName")]
    public string FirstName { get; set; }

    [DataMember(Name = "LastName")]
    public string LastName { get; set; }

    public bool IsNew { get; set; }

    public Person(string first, string last)
    {
        this.FirstName = first;
        this.LastName = last;
        this.IsNew = true;
    }
}

【问题讨论】:

    标签: c# .net initialization default-value datacontractserializer


    【解决方案1】:

    您可以使用序列化回调。将以下方法添加到您的 Person 类:

    [OnDeserialized]
    void OnDeserialized(StreamingContext context)
    {
        this.IsNew = true;
    }
    

    另一个选项是删除 [DataContract] 和 [DataMember] 属性。在这种情况下,DCSerializer 将在反序列化时调用您的构造函数。

    【讨论】:

    • 正如 Pavel 所说,它应该是 [OnDeserializing] 否则每次都会覆盖该值,而不仅仅是一次(当它丢失时)。
    【解决方案2】:

    实际上正确的做法是使用 OnDeserializing 属性(注意“ing”后缀)。在成员值被反序列化之前调用该属性标记的方法。

    【讨论】:

    • 谢谢。是的, OnDeserializing 是正确的方法。如果源具有该属性的值,它允许设置可以被覆盖的默认值。
    猜你喜欢
    • 2012-12-15
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多