序列化」可被定義為將物件的狀態儲存到儲存媒介中的過程。在此過程中,物件的公共欄位和私有字段以及類的名稱(包括包含該類的程式集)都被轉換為位元組流,然後寫入資料流。在以後「反序列化」該物件時,建立原始物件的精確複本。
一、為什麼要選擇序列化
乙個原因是將物件的狀態保持在儲存**中,以便可以在以後重新建立精確的副本;
另乙個原因是通過值將物件從乙個應用程式域傳送到另乙個應用程式域中。
例如,序列化可用於在 asp.net 中儲存會話狀態並將物件複製到 windows 窗體的剪貼簿中。遠端處理還可以使用序列化通過值將物件從乙個應用程式域傳遞到另乙個應用程式域中。
二、如何實現物件的序列化及反序列化
要實現物件的序列化,首先要保證該物件可以序列化。而且,序列化只是將物件的屬性進行有效的儲存,對於物件的一些方法則無法實現序列化的。
實現乙個類可序列化的最簡便的方法就是增加serializable屬性標記類。如:
[serializable()]
public class meablock
}即可實現該類的可序列化。
要將該類的例項序列化為到檔案中?.net framework提供了兩種方法:
1、xml序列化
使用 xmlserializer 類,可將下列項序列化。
要實現上述類的例項的序列化,可參照如下例子:
meablock myblock = new meablock();
// insert code to set properties and fields of the object.
xmlserializer myserializer = new xmlserializer(typeof(meablock));
// to write to a file, create a streamwriter object.
streamwriter mywriter = new streamwriter("myfilename.xml");
myserializer.serialize(mywriter, meablock);
需要注意的是xml序列化只會將public的字段儲存,對於私有字段不予於儲存。
生成的xml檔案格式如下:
test
對於物件的反序列化,則如下:
meablock myblock;
// constructs an instance of the xmlserializer with the type
// of object that is being deserialized.
xmlserializer myserializer = new xmlserializer(typeof(meablock));
// to read the file, creates a filestream.
filestream myfilestream = new filestream("myfilename.xml", filemode.open);
// calls the deserialize method and casts to the object type.
myblock = (meablock)myserializer.deserialize(myfilestream)
2、二進位制序列化
與xml序列化不同的是,二進位制序列化可以將類的例項中所有字段(包括私有和公有)都進行序列化操作。這就更方便、更準確的還原了物件的副本。
要實現上述類的例項的序列化,可參照如下例子:
meablock myblock = new meablock();
// insert code to set properties and fields of the object.
iformatter formatter = new binaryformatter();
stream stream = new filestream("myfile.bin",filemode.create,fileaccess.write, fileshare.none);
formatter.serialize(stream, myblock);
stream.close();
對於物件的反序列化,則如下:
iformatter formatter = new binaryformatter();
stream stream = new filestream("myfile.bin", filemode.open,fileaccess.read, fileshare.read);
meablock myblock = (meablock) formatter.deserialize(stream);
stream.close();
三、如何變相實現自定義視覺化控制項的序列化、反序列化
對於winform中自定義控制項,由於繼承於system.windows.form類,而form類又是從marshalbyrefobject繼承的,窗體本身無法做到序列化,窗體的實現基於win32下gui資源,不能脫離當前上下文存在。
當然可以採用變通的方法實現控制項的序列化。這裡採用的是記憶類模型。
定義記憶類(其實就是乙個可序列化的實體類)用於記錄控制項的有效屬性,需要序列化控制項的時候,只需要將該控制項的例項copy到記憶類,演變成序列化儲存該記憶類的操作。
反序列化是乙個逆過程。將資料流反序列化成為該記憶類,再根據該記憶類的屬性生成控制項例項。而對於控制項的一些事件、方法則可以繼續使用。
PHP反序列化學習
利用反序列化漏洞的有兩個條件 1.unserialize 函式的引數可控 2.php中有可以利用的類並且類中有魔術函式 魔術方法就是在某些條件下自動執行的函式 序列化 sites array google runoob facebook serialized data serialize sites...
PHP反序列化學習
在理解這個漏洞前,你需要先搞清楚php中serialize unserialize 這兩個函式。序列化serialize 序列化說通俗點就是把乙個物件變成可以傳輸的字串,比如下面是乙個物件 class s s new s 建立乙個物件 serialize s 把這個物件進行序列化 序列化後得到的結果...
反序列化學習筆記
什麼是序列化,就是將物件轉換為字串。什麼是反序列化,就是將字串轉化為物件。為什麼會有序列化機制?在傳遞變數的過程中,有可能遇到變數值要跨指令碼檔案傳遞的過程。如果乙個指令碼中想要呼叫之前乙個指令碼的變數,但是之前的指令碼已經執行完畢,所有變數和內容被釋放掉了序列化與反序列化一些簡單例子 demo n...