《CLR via C 》讀書筆記 之 執行時序列化

2022-05-31 17:45:13 字數 2758 閱讀 3980

2013-04-10

24.1 序列化/反序列化快速入門

24.2 使型別可序列化

24.3 控制序列化和反序列化

序列化(serialization)是將乙個物件或者物件圖轉換成位元組流的過程。反序列化(deserialization)是將乙個位元組流轉換會物件的過程。在物件和位元組流之間轉換時非常有用的機制。下面是一些例子:

應用程式的狀態(物件圖)可以儲存到磁碟檔案或資料庫,並在應用程式下次執行時恢復。如asp.net就是利用它來保持和恢復會話狀態的。

乙個物件可以輕鬆複製到系統的剪貼簿,在貼上會同乙個或另乙個應用程式。windows窗體和wpf就是利用這個功能。

除了上述應用,一旦將物件序列化為記憶體中的乙個位元組流,可以使用一些更有用的方式來方便的處理資料,比如加密和壓縮資料等。

返回view code

1

using

system.io;

2using

system.reflection;

3using

system.runtime.serialization;

4using

system.runtime.serialization.formatters.binary;56

internal

static

class

quickstart ;

10 stream stream =serializetomemory(objectgraph);

1112

//reset everything for this demo

13 stream.position = 0

;14 objectgraph = null;15

16//

deserialize the objects and prove it worked

17 objectgraph = (list)deserializefrommemory(stream);

18foreach (var s in

objectgraph) console.writeline(s);19}

2021

private

static

memorystream serializetomemory(object objectgraph)

3435

private

static

object deserializefrommemory(stream stream)

42 }

fcl提供了兩個格式化器:binaryformatter和soapformatter。要序列化乙個物件圖,只需呼叫格式化器的serialize方法 。方法原型如下:

view code

1

public

void serialize(stream serializationstream, object graph);

格式化器呼叫serialize方法是,為了確保物件圖中所有物件都被序列化到流中,格式器會參考每個型別的元資料。序列化時,利用反射來檢視每個物件型別中有哪些例項字段,這些例項欄位中,又有哪些引用了其他物件,然後對他們進行序列化。

序列化是應注意:

1)使用相同的格式化器進行序列化和反序列化。

2)序列化乙個物件時,型別的全名和型別定義的程式集名稱會被寫入流。在反序列化是,會用這些資訊,會用system.reflection.assembly.load方法引導程式集,再在程式集中找到匹配的型別,找到後建立型別的例項,並用流中的值對其欄位進行初始化。

返回fcl得內建型別或者說基元型別已經標識的特性[serializable],使得他們可序列化。

使型別可序列化語法很簡單,只需在類上標上特性[serializable],它是在system命名空間中定義的。

serializableattribute這個特性只能應用於引用型別、值型別。除此之外,這個特性是不會被派生類繼承的;反之,則不亦然因此system.object標識了這個特性。

返回類標識上特性[serializable]後,所有例項字段(public,private,protected)都會被序列化,有時我們不希望某些欄位被例項化,如下情況:

標識欄位不需序列化也很簡單,只需在字段前標上特性[nonserializable]即可。注意:該特性不會被派生類繼承。

但當乙個字段沒有序列化,會在反序列化化是出現問題,如某些方法用到這個字段,需要當前值,fcl提供了以下方法:

view code

1

[onserializing]

2private

void

onserializing(streamingcontext context)

3

4[onserialized]

5private

void

onserialized(streamingcontext context)

6 78

[ondeserializing]

9private

void

ondeserializing(streamingcontext context)

10

11[ondeserialized]

12private

void

ondeserialized(streamingcontext context)

13

《CLR via C 》讀書筆記 之 方法

2013 02 27 8.1 例項構造器和類 引用型別 8.2 例項構造器和結構 值型別 8.3 型別構造器 8.6 擴充套件方法返回 建立引用型別的例項的過程 1 為例項的資料字段分配記憶體 例項字段包括本身及其基類的例項字段 2 然後初始化物件的附加字段 型別物件指標和同步塊索引 3 呼叫型別的...

《CLR via C 》讀書筆記 之 引數

2013 02 27 預設情況下,clr假定所有方法引數都是傳值的。當傳遞引用型別的物件時,也預設是傳值的,只不過這個值是引用 指標 本身。clr允許以傳引用的方式傳遞引數。在c 中,用關鍵字out或ref來告訴編譯器。編譯器將傳遞引數的位址,而不是傳遞引數本身。從clr角度看,out和ref完全一...

CLR via C 讀書筆記1 9

與非託管 的互操作 clr 提供3種與非託管 的互動方案 託管 通過使用 p invoke 機制 來呼叫dll檔案中的非託管函式 許多 fcl 中定義的型別內部都有呼叫到 kernel32.dll,user32.dll 等等檔案中的函式。同時許多程式語言會提供託管 呼叫非託管 的簡便途徑,比如 c ...