序列化 (2) – 選擇性序列化物件成員

  • 1575
  • 0
  • 2013-07-29

在序列化的過程中,你可能想要選擇性的分解物件的某些資料成員,這時我們可以透過屬性 [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 將會有值 “預設沒有任何建議”。

 

結語

本文說明了如何針對某些類別成員不做序列化分解,讓您可以針對敏感性的資料不做序列化。在接下來的系列文章中,將會說明如何藉由自訂序列化的行為,來調整資料內容。

 

其他相關資訊

NonSerializedAttribute 類別

IDeserializationCallback 介面

IDeserializationCallback.OnDeserialization 方法