2011-06-17 81 views
5

可以說我有一類系列化沒有NULL值

[Serializable()] 
public class Car 
{ 
    public string model; 
    public int year; 
} 

我序列化到一個名爲「car.xx」磁盤。然後我一個屬性添加到我的汽車類,所以這將是這樣的:

[Serializable()] 
public class Car 
{ 
    public string model; 
    public int year; 
    public string colour; 
} 

然後我反序列化「car.xx」(包含2場),對包含3個字段我目前的汽車類,這將使我們的汽車類的「顏色」屬性null

我該如何設置「新屬性」不要獲得空值?在構造函數中設置它們不會有幫助。

我使用BinaryFormatter的串行

我想是空與「」

+0

你試過只是將它設置這樣的'公共串色= 「紅」;'? –

+0

你會得到什麼?如果*有*數據中沒有顏色? –

+0

我希望它是「」而不是null – syncis

回答

4

,如果你不使用XmlSerializer的,然後考慮使用OnDeserializedAttribute,OnSerializingAttribute,OnSerializedAttribute和OnDeserializingAttribute屬性

看到this

,如:

[Serializable()] 
public class Car 
{ 
    public string colour; 
    public string model; 
    public int year; 

    [OnDeserialized()] 
    internal void OnDeserializedMethod(StreamingContext context) 
    { 
     if (colour == null) 
     { 
      colour = string.Empty; 
     } 
    } 
} 
1

這一切都取決於串行替換字符串值。

一些串行器跳過構造函數;一些序列化程序運行默認的構造函數。有些讓你選擇。一些提供序列化回調。

所以根據串行:

  • 寫信公共參數構造來設置默認值(或使用場的初始化,這是最終相似)
  • 寫「接通反串行化」序列化回調反序列化

或最壞情況下的前設置一個默認的,實現自定義序列(ISerializable/IXmlSerializable /等等,這取決於串行)

例如,BinaryFormatter

[Serializable] 
public class Car : IDeserializationCallback 
{ 
    public string model; 
    public int year; 
    public string colour; 
    void IDeserializationCallback.OnDeserialization(object sender) 
    { 
     if (colour == null) colour = ""; 
    } 
} 

與其他串行化,它可能會使用[OnDeserialized]來代替。注意;我個人不會公開領域,即使是在DTO中。但是如果你正在使用BinaryFormatter,改變這個現在是一個突破性的改變。爲了完整性,我也不會使用BinaryFormatter - 它是而不是對此非常友好。其他序列化器可用,這會傷害你更少。