7

如果我使用DataContractSerializer序列化并稍后反序列化一个类,如何控制未序列化的属性的初始值?当使用DataContractSerializer时设置属性的初始值

请考虑下面的Person类。其数据合同设置为序列化FirstNameLastName属性,但不包括IsNew属性。我想要IsNew初始化为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; 
    } 
} 

回答

10

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

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

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

+1

由于Pavel提到它应该是[OnDeserializing],否则每次的值都会被覆盖,而不是一次(当它缺失时)。 – 2017-01-17 11:52:59

14

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

+0

谢谢。是的,OnDeserializing是正确的方法。它允许设置可以覆盖的默认值,如果源具有该属性的值。 – Hong 2014-07-29 23:25:47

相关问题