使用DataContractSerializer时设置属性的初始值

时间:2010-04-28 00:01:29

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

如果我使用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;
    }
}

2 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:10)

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

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

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