在序列化的過程中,你可能想要選擇性的分解物件的某些資料成員,這時我們可以透過屬性 [NonSerialized] 來標示物件中的某些成員不可序列化,經過標示的成員,在序列化過程中不會被分解,您可以使用這個屬性來防止敏感性資料的序列化。
MSDN 技術文章:序列化 (2) – 選擇性序列化物件成員
簡介
在序列化的過程中,你可能想要選擇性的分解物件的某些資料成員,這時我們可以透過屬性 [NonSerialized] 來標示物件中的某些成員不可序列化,經過標示的成員,在序列化過程中不會被分解,您可以使用這個屬性來防止敏感性資料的序列化。
範例說明
在先前的文章中,我們定義了一個類別,我們將 ClsSerializable 資料成員 _Cmt 作修改,加上 [NonSerialized] 標示為不可序列化。
[Serializable]
public class ClsSerializable
{
private int _Number;
private string _Name;
[NonSerialized]
private string _Cmt;
public ClsSerializable()
{
this._Number = 7;
this._Name = "Ou";
this._Cmt = "喜歡音樂";
}
public int Number
{
get { return this._Number; }
}
public string Name
{
get { return this._Name; }
}
public string Cmt
{
get { return this._Cmt; }
}
}
重新執行程式,在做序列化時,由於 _Cmt 標示為 [NonSerialized],因此不會被序列化。
當您還原序列化重組物件得到的結果,_Cmt 為空值而非原先的"喜歡音樂”。
在這樣的狀況下,如果在還原序列化的過程,想要將 [NonSerialized] 標示的成員給定預設值,我們可以透過 IDeserializationCallback 介面並且實作IDeserializationCallback.OnDeserialization 方法,例如:
[Serializable]
public class ClsSerializable : IDeserializationCallback
{
private int _Number;
private string _Name;
[NonSerialized]
private string _Cmt;
public ClsSerializable()
{
this._Number = 7;
this._Name = "Ou";
this._Cmt = "喜歡音樂";
}
public int Number
{
get { return this._Number; }
}
public string Name
{
get { return this._Name; }
}
public string Cmt
{
get { return this._Cmt; }
}
void IDeserializationCallback.OnDeserialization(Object sender)
{
this._Cmt = "預設沒有任何建議";
}
}
在還原序列化重組物件得到的結果,_Cmt 將會有值 “預設沒有任何建議”。
結語
本文說明了如何針對某些類別成員不做序列化分解,讓您可以針對敏感性的資料不做序列化。在接下來的系列文章中,將會說明如何藉由自訂序列化的行為,來調整資料內容。