c 學習筆記 序列化

2021-06-28 06:01:19 字數 2930 閱讀 6685

1.物件序列化的介紹

(1).net支援物件序列化的幾種方式

二進位制序列化:物件序列化之後是二進位制形式的,通過binaryformatter類來實現的,這個類位於system.runtime.serialization.formatters.binary命名空間下。

soap序列化:物件序列化之後的結果符合soap協議,也就是可以通過soap 協議傳輸,通過system.runtime.serialization.formatters.soap命名空間下的soapformatter類來實現的。

xml序列化:物件序列化之後的結果是xml形式的,通過xmlserializer 類來實現的,這個類位於system.xml.serialization命名空間下。xml序列化不能序列化私有資料。

(2)幾種序列化的區別

二進位制格式和soap格式可序列化乙個型別的所有可序列化字段,不管它是公共字段還是私有字段。xml格式僅能序列化公共欄位或擁有公共屬性的私有字段,未通過屬性公開的私有欄位將被忽略。

使用二進位制格式序列化時,它不僅是將物件的字段資料進行持久化,也持久化每個型別的完全限定名稱和定義程式集的完整名稱(包括包稱、版本、公鑰標記、區域性),這些資料使得在進行二進位制格式反序列化時亦會進行型別檢查。soap格式序列化通過使用xml命名空間來持久化原始程式集資訊。而xml格式序列化不會儲存完整的型別名稱或程式集資訊。這便利xml資料表現形式更有終端開放性。如果希望盡可能延伸持久化物件圖的使用範圍時,soap格式和xml格式是理想選擇。

(3)使用特性對序列化的控制

要讓乙個物件支援.net序列化服務,使用者必須為每乙個關聯的類加上[serializable]特性。如果類中有些成員不適合參與序列化(比如:密碼字段),可以在這些域前加上[nonserialized]特性。

2.使用二進位制序列化和反序列化

(1)二進位制序列化與反序列化的程式示例

複製**

**如下:

[serializable]  //必須新增序列化特性

public class person

public override string tostring()

} [serializable]  //必須新增序列化特性

public class programmer : person

public override string tostring()

} class program

console.read(); }

}(2)總結

使用二進位制序列化,必須為每乙個要序列化的的類和其關聯的類加上[serializable]特性,對類中不需要序列化的成員可以使用[nonserialized]特性。

二進位制序列化物件時,能序列化類的所有成員(包括私有的),且不需要類有無引數的構造方法。

使用二進位制格式序列化時,它不僅是將物件的字段資料進行持久化,也持久化每個型別的完全限定名稱和定義程式集的完整名稱(包括包稱、版本、公鑰標記、區域性),這些資料使得在進行二進位制格式反序列化時亦會進行型別檢查。所以反序列化時的執行環境要與序列化時的執行環境要相同,否者可能會無法反序列化成功。

3.使用soap方式序列化和反序列化

(1)soap序列化與反序列化的程式示例

複製**

**如下:

[serializable]  //必須新增序列化特性

public class person

public override string tostring()

} [serializable]  //必須新增序列化特性

public class programmer : person

public override string tostring()

} class program

} (2)總結

soap序列化與二進位制序列化的區別是:soap序列化不能序列化泛型型別。與二進位制序列化一樣在序列化時不需要向序列化器指定序列化物件的型別。而xml序列化需要向xml序列化器指定序列化物件的型別。

4.使用xml方式序列化和反序列化

(1)xml序列化與反序列化的程式示例

複製**

**如下:

public class person

//必須提供無參構造器,否則xmlserializer將出錯

public person(string name, bool ***)

public override string tostring()

} public class programmer : person

//必須提供無參構造器,否則xmlserializer將出錯

public programmer(string name, bool ***, string language) : base(name, ***)

public override string tostring()

} class program

);//建立xml序列化器,需要指定物件的型別

xmlformat.serialize(fstream, list);

//使用xml反序列化物件

fstream.position = 0;//重置流位置

list.clear();

list = (list)xmlformat.deserialize(fstream);

foreach (programmer p in list)

console.read(); }

}(2)總結

使用xml序列化或反序列化時,需要對xml序列化器指定需要序列化物件的型別和其關聯的型別。

xml序列化只能序列化物件的公有屬性,並且要求物件有乙個無參的構造方法,否者無法反序列化。

[serializable]和[nonserialized]特性對xml序列化無效!所以使用xml序列化時不需要對物件增加[serializable]特性。

C 序列化 反序列化

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

C 學習筆記25 序列化和反序列化

序列化 serialization 是將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程,序列把物件轉換成有序位元組流,以便在網路上傳輸或者儲存在本地檔案中 序列化的主要目的有三個 1 以某種儲存形式使自定義物件持久化 2 將物件從乙個地方傳遞到另乙個地方 3 使程式更具維護。對於需要序列化的物件,需...

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

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