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

相關問題