C# 使用DataContractSerializer时设置属性的初始值
如果使用C# 使用DataContractSerializer时设置属性的初始值,c#,.net,initialization,default-value,datacontractserializer,C#,.net,Initialization,Default Value,Datacontractserializer,如果使用DataContractSerializer序列化并随后反序列化一个类,如何控制未序列化属性的初始值 考虑下面的Person类。它的数据协定设置为序列化FirstName和LastName属性,但不序列化IsNew属性。我希望IsNew初始化为TRUE,无论是将一个新人实例化为新实例还是从文件反序列化 通过构造函数很容易做到这一点,但据我所知,DataContractSerializer不调用构造函数,因为它们可能需要参数 [DataContract(Name="Person")] pu
DataContractSerializer
序列化并随后反序列化一个类,如何控制未序列化属性的初始值
考虑下面的Person
类。它的数据协定设置为序列化FirstName
和LastName
属性,但不序列化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;
}
}
您可以使用序列化回调。将以下方法添加到Person类:
[OnDeserialized]
void OnDeserialized(StreamingContext context)
{
this.IsNew = true;
}
另一个选项是删除[DataContract]和[DataMember]属性。在这种情况下,DCSerializer将在反序列化时调用构造函数。实际上,正确的方法是使用OnDeserialize属性(注意“ing”后缀)。在反序列化成员值之前,将调用标记有此属性的方法。谢谢。是的,序列化是正确的方法。它允许设置默认值,如果源具有该属性的值,则可以覆盖该值。正如Pavel提到的,它应该是[OnDeserialization],否则该值将每次覆盖,而不是仅覆盖一次(当它丢失时)。