天天看點

簡單對象的序列化

導言

      有多少次你僅僅想通過TCP/IP 協定來建構一個簡單的用戶端/伺服器程式,多少次,使用 .NET Framework 序列化(XMLSerializer或者<code>BinarySerializer</code>)通過讓您的資料對象通過網絡發送正确,被你搞得一團糟,不用争辯,在這篇文章中你看見簡單的序列化的介紹。在也不會被MarshalByRefObject和XML的一些屬性弄得一團糟。

背景:

  如果你不熟悉.NET Reflection 命名空間,在讀這篇文章之前,我建議你看看一些關于反射的教程,否則這些代碼看起來比較神秘和困惑。

使用代碼:

   好,現在我們開始,我們将來開發一個自定義的能将任何給出的對象轉換成一段XML格式的字元串的序列化類。這篇文章中,我對序列化和反序列化對象做了一些限制,這些對象隻包括:基元(Primitives),枚舉(Enums),Lists(通用和非通用)和字典(通用dictionary,Hashtable)類型,以及這些基本類型的嵌套組合。基本上,該序列化是通過循環遞歸給定的輸入值然後将它轉換成要求的輸出值.對于序列化過程中,輸入值将是一個是僅限于以上述的類型對象執行個體,輸出值将是XML一個字元串執行個體。對于在反序列化的過程中,輸入和輸出的角色做相應交換。

    根據這個思路,提供給使用者的序列化類,我們需要有兩個公有的方法:

<code>public string Serialize(object input);</code>

<code>public object Deserialize(string input);</code> 

<code> </code>

簡單對象的序列化

代碼

   在這篇文章中請注意,為了簡化問題,我們期望程式集中包含序列化和反序列化的類型是為應用程式每個過程都曉得的。 在更普遍的情況下,我們也可以存儲包含的類型裝配資訊的程式集。使用第二個XmlAttribute我們可以連接配接到該執行個體的節點。這樣,在反序列化時,我們可以加載,并采取了我們的序列化的對象類型的集會。我們采取走出這個序列組裝對象類型。我們可以做,在每一個階段,但在遞歸記住了你的XML檔案的大小大的時候這個限制,是以你應該問自己是否真的需要這種靈活性,或者如果你能忍受的限制,所有過程知道您的類型了。   下一步,我們看看 SerializeRecursive 方法,看他如何處理不同的情況。

Primitives

Enum Types

List Types

Dictionary Types

簡單對象的序列化

如果你根據這個遞歸去做,了解所有的情況和他們如何處理的。 DeserializeRecursive() 方法不言自明。你能找到注釋在這篇文章附加的代碼裡面.

興趣點:

例子的代碼隻為了說明基本的一些觀點. 它沒有包含任何的錯誤處理,它不能處理 "unhandled" 的類型,是以我建議不要将它使用在項目裡面。

節本上這個序列化類能處理任何一個隻包含 primitives, enums, strings, Lists 和 Dictionaries 的的對象

請記住,有一些對象是不能序列化的,例如:Forms, Controls, Type 或者 Assembly 對象,如果你想在你的項目中使用這種方法,你應該相應的處理這些類型。

本文轉自麒麟部落格園部落格,原文連結:http://www.cnblogs.com/zhuqil/archive/2009/12/10/1620975.html,如需轉載請自行聯系原作者