如果我使用DataContractSerializer
序列化并稍后反序列化类,如何控制未序列化的属性的初始值?
考虑下面的Person
课程。其数据协定设置为序列化FirstName
和LastName
属性,但不是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;
}
}
答案 0 :(得分:15)
实际上,正确的方法是使用OnDeserializing属性(注意“ing”后缀)。在反序列化成员值之前调用标有此属性的方法。
答案 1 :(得分:10)
您可以使用序列化回调。将以下方法添加到Person类:
[OnDeserialized]
void OnDeserialized(StreamingContext context)
{
this.IsNew = true;
}
另一个选项是删除[DataContract]和[DataMember]属性。在这种情况下,DCSerializer将在反序列化时调用构造函数。