c 序列化問題

2021-05-24 02:19:00 字數 3189 閱讀 7271

1.什麼是序列化

序列化是將物件狀態轉換為可保持或傳輸的格式的過程,在序列化過程中,物件的公共欄位和私有字段以及類的名稱(包括包含該類的程式集)都被轉換為位元組流,然後寫入資料流。與序列化相對的是反序列化,它將流轉換為物件。這兩個過程結合起來,可以輕鬆地儲存和傳輸資料。

2.為什麼使用序列化

a. 乙個原因是將物件的狀態保持在儲存**中,以便可以在以後重新建立精確的副本。

我們經常需要將物件的字段值儲存到磁碟中,並在以後檢索此資料。儘管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤 物件的層次結構時,會變得越來越複雜。可以想象一下編寫包含大量物件的大型業務應用程式的情形,程式設計師不得不為每乙個物件編寫**,以便將字段和屬性儲存 至磁碟以及從磁碟還原這些欄位和屬性。序列化提供了輕鬆實現這個目標的快捷方法。

b.另乙個原因是通過值將物件從乙個應用程式域傳送到另乙個應用程式域中。

例如,序列化可用於在 asp.net 中儲存會話狀態並將物件複製到 windows 窗體的剪貼簿中。遠端處理還可以使用序列化通過值將物件從乙個應用程式域傳遞到另乙個應用程式域中。

公共語言執行時 (clr) 管理物件在記憶體中的分布,.net 框架則通過使用反射提供自動的序列化機制。物件序列化後,類的名稱、程式集以及類例項的所有資料成員均被寫入儲存**中。物件通常用成員變數來儲存對其他 例項的引用。類序列化後,序列化引擎將跟蹤所有已序列化的引用物件,以確保同一物件不被序列化多次。.net 框架所提供的序列化體系結構可以自動正確處理物件圖表和迴圈引用。對物件圖表的唯一要求是,由正在進行序列化的物件所引用的所有物件都必須標記為 serializable(請參閱基本序列化)。否則,當序列化程式試圖序列化未標記的物件時將會出現異常。

當反序列化已序列化的類時,將重新建立該類,並自動還原所有資料成員的值。

3.如何實現物件的序列化及反序列化

要實現物件的序列化,首先要保證該物件可以序列化。而且,序列化只是將物件的屬性進行有效的儲存,對於物件的一些方法則無法實現序列化的。

實現乙個類可序列化的最簡便的方法就是增加serializable屬性標記類。如:

[serializable()]

public class meablock

}即可實現該類的可序列化。注意序列化的類必須為public,否則不能夠被序列化。

要將該類的例項序列化為到檔案中?.net framework提供了兩種方法:

a .xml序列化

使用 xmlserializer 類,可將下列項序列化。

公共類的公共讀/寫屬性和字段

實現 icollection 或 ienumerable 的類。(注意只有集合會被序列化,而公共屬性卻不會。)

xmlelement 物件。

xmlnode 物件。

dataset 物件。

要實現上述類的例項的序列化,可參照如下例子:

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)

b. 二進位制序列化

與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();

4、如何變相實現自定義視覺化控制項的序列化、反序列化

C 序列化 反序列化

序列化又稱序列化,是.net執行時環境用來支援使用者定義型別的流化的機制。其目的是以某種儲存形成使自定義物件持久化,或者將這種物件從乙個地方傳輸到另乙個地方。net框架提供了兩種序列化的方式 1 是使用binaryformatter進行序列化 2 使用soapformatter進行序列化 3 使用x...

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...

序列化問題

對於ajax來說,只能接收字串,那麼我們在後台的關鍵問題是,如何才能將我們要傳入的資料序列化,使之成為ajax可以接收的資料型別呢?json模組是乙個序列化的辦法,然而json只能序列化python的三大資料型別,元組,列表,字典,對於其他的資料型別,json並不能為我們序列化,那麼我們應該怎麼辦呢...