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

Eri*_*tas 10 .net c# 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 16

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


ale*_*dej 10

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

[OnDeserialized]
void OnDeserialized(StreamingContext context)
{
    this.IsNew = true;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 正如 Pavel 所提到的,它应该是 [OnDeserializing] 否则该值将每次都被覆盖,而不仅仅是一次(当它丢失时)。 (2认同)