Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DataContractSerializer时设置属性的初始值_C#_.net_Initialization_Default Value_Datacontractserializer - Fatal编程技术网

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],否则该值将每次覆盖,而不是仅覆盖一次(当它丢失时)。