1

我嘗試通過數據合同序列化來序列化和反序列化自定義類。 序列化效果很好。但是,當反序列化時,我遇到了一個問題,因此(source):如何在反序列化之前調用構造函數?

對象反序列化時不調用構造函數。

事情是,我在構造函數中做了一些初始化。 這包括一些數據結構。

沒有對構造函數的調用,數據結構爲null,並且在反序列化過程中調用setter函數失敗。

如何在使用任何訪問器之前在反序列化過程之前或過程中調用構造函數或初始化對象?

有幾個方法,我可以通過屬性爲回調聲明,像這樣(同一消息來源):

// This method is called after the object 
// is completely deserialized. Use it instead of the 
// constructror. 
[OnDeserialized] 
void OnDeserialized(StreamingContext context) 
{ 
    fullName = firstName + " " + lastName; 
} 

但是看起來他們都是的deserialisation後觸發

是否必須切換到XML序列化?

+1

在應用程序序列化之前,這應該已經發生了。所以再這樣做會是錯誤的。 –

+0

是的,使用'OnDeserialized'方法可以初始化字段。在此之前,沒有人可以訪問字段/屬性。 –

+0

@HansPassant反序列化獨立發生。在程序的執行過程中,我只加載序列化數據並想將其反序列化爲一個對象。在反序列化之前甚至沒有發生序列化(在這個程序的例子中)。我不太確定在此之前我將如何調用構造函數。 – null

回答

3

與簽名

protected YourClassName(SerializationInfo info, StreamingContext context) 
{ 
} 

創建一個構造函數,讓你的類實現ISerializable。在序列化時,它調用ISerializable.GetObjectData()去反序列化它調用上述構造函數。

Custom Serialization: Implementing the ISerializable Interface在MSDN

如果你實際上並不需要做在構造函數中工作,你可以使用屬性[OnDeserializing]而不是[OnDeserialized]來完成工作反序列化,而不是之後。

[OnDeserializing] 
private void SetValuesOnDeserializing(StreamingContext context) 
{ 
    // Code not shown. 
} 

注意:如果你在你的對象圖,他們被稱爲順序有不止一個[OnDeserializing]方法不dertimistic。

+0

[文檔說謊](https://msdn.microsoft.com/en-us/library/6exf3h2k(v = vs.110).aspx)「*任何給定的類型都可以支持none,one或更多的序列化技術。*「,因爲我無法同時實現'ISerializable'並使用'DataContractAttribute',另一方面'[OnDeserializing]'效果很好。 – null

相關問題