2013-04-10
24.1 序列化/反序列化快速入門
24.2 使型別可序列化
24.3 控制序列化和反序列化
序列化(serialization)是將乙個物件或者物件圖轉換成位元組流的過程。反序列化(deserialization)是將乙個位元組流轉換會物件的過程。在物件和位元組流之間轉換時非常有用的機制。下面是一些例子:
應用程式的狀態(物件圖)可以儲存到磁碟檔案或資料庫,並在應用程式下次執行時恢復。如asp.net就是利用它來保持和恢復會話狀態的。
乙個物件可以輕鬆複製到系統的剪貼簿,在貼上會同乙個或另乙個應用程式。windows窗體和wpf就是利用這個功能。
除了上述應用,一旦將物件序列化為記憶體中的乙個位元組流,可以使用一些更有用的方式來方便的處理資料,比如加密和壓縮資料等。
返回view code
1fcl提供了兩個格式化器:binaryformatter和soapformatter。要序列化乙個物件圖,只需呼叫格式化器的serialize方法 。方法原型如下: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 }
view code
1格式化器呼叫serialize方法是,為了確保物件圖中所有物件都被序列化到流中,格式器會參考每個型別的元資料。序列化時,利用反射來檢視每個物件型別中有哪些例項字段,這些例項欄位中,又有哪些引用了其他物件,然後對他們進行序列化。public
void serialize(stream serializationstream, object graph);
序列化是應注意:
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 ...