大家都知道,我們具有三種定義可序列化型別的方式:在型別上應用serializableattribute特性;應用datacontractattribute/datamemberattribute特性和實現iserializable介面。當你通過繼承乙個現有的類來定義你需要被序列化的類,如果這個父類實現了iserializable介面,如果定義不當,就會出現反序列化的問題。而且這個我們可能經常都不注意。
首先,我想自定義乙個字典型別mydictionary,其key和value的型別分別為string和object。最簡單的方式莫過於直接繼承dictionary。為了讓mydictionary物件可序列化,我們在型別上面應用了serializableattribute特性。mydictionary定義如下:
2:public
class mydictionary : dictionary
3:然後我通過下面的**對mydictionary物件進行序列化和反序列化,我直接採用的序列化器為binaryformatter。
1:static
void main(string args)
2:
15:
16:foreach (var item in dictionary)
17: : ", item.key, item.value);
19: }
20: }現在我們執行這段**,在進行但序列化的時候出現如下serialiationexception的異常,錯誤訊息提示找不到建構函式。
通過上面的截圖,我們可以看到具體的錯誤訊息:「the constructor to deserialize an object of type 'deserializationissue.mydictionary' was not found.」,對於這個訊息,我們第乙個反應是在反序列化的時候找不到預設(無參)的建構函式。但是再看mydictionary的定義,我們不曾定義任何建構函式,意味著它具有乙個預設(無參)建構函式。
實際上,這裡並不是找不到預設(無參)建構函式,而是找不到乙個具有特殊引數列表的建構函式。該建構函式接收兩個引數,型別分別是:serializationinfo和streamingcontext。所以我們的解決方案很簡單,就是加上這麼乙個建構函式。為此我們從新定義mydictionary。
1: [serializable]
2:public
class mydictionary : dictionary
3:
5:protected mydictionary(serializationinfo info, streamingcontext context) : base(info, context)
6: }從新執行我們的程式,你就會得到想要的輸出結果:
1: 001: foo
2: 002: bar
3: 003: baz如果乙個型別實現了iserializable介面(dictionary就實現了這個介面),你就應該定義如上乙個建構函式。這算是乙個約定,但是當你繼承某個型別的時候,你往往會忘記這個約定。
乙個序列化與反序列化object的方法
xml序列化物件 object that would be converted into xml public static string objecttoxml object instance catch exception ex finally if writer null return for...
php反序列化注入,php關於反序列化物件注入漏洞
php物件注入是乙個非常常見的漏洞,這個型別的漏洞雖然有些難以利用,但仍舊非常危險。本文主要和大家分享php關於反序列化物件注入漏洞詳解,希望能幫助到大家。分析php基礎 serialize 把乙個物件轉成字串形式,可以用於儲存 unserialize 把serialize序列化後的字串變成乙個物件...
記錄乙個靶場反序列化漏洞
序列化 序列化 serialization 是將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。在序列化期間,物件將其當前狀態寫入到臨時或永續性儲存區。以後,可以通過從儲存區中讀取或反序列化物件的狀態,重新建立該物件。反序列化 反序列化與 serialize 對應的,unserialize 可以從已...