10

如果我正在序列化并稍后反序列化一个类,DataContractSerializer我该如何控制未序列化的属性的初始值?

考虑下面的Person课程。它的数据契约被设置为序列化FirstNameandLastName属性而不是IsNew属性。我想IsNew将一个新的 Person 实例化为新实例还是从文件中反序列化,我想初始化为 TRUE。

这很容易通过构造函数完成,但据我所知,它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;
    }
}
4

2 回答 2

20

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

于 2010-05-19T21:06:32.207 回答
10

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

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

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

于 2010-04-28T00:04:43.790 回答