2010-10-21 40 views
6

序列化到底在哪裏?我對「網瞭解serializtion和我來知道什麼是序列化?

它是一個接口,如果在一個類實現,意味着它可以自動進行序列化,並通過不同的串行解串。

給我一個很好的理由爲什麼和什麼時候需要序列化一個類?假設一旦它被序列化,究竟發生了什麼?

回答

25

無論何時需要持續或傳輸對象超出其存在範圍時,都需要序列化。

持久性是能夠將某個對象保存到某處並稍後以相同的狀態加載它。例如:

  • 您可能需要將對象實例存儲在磁盤上作爲文件的一部分。
  • 您可能需要將對象作爲blob(二進制大對象)存儲在數據庫中。

傳輸是將對象以外的對象發送到某個接收者的能力。例如:

  • 您可能需要將對象的實例傳輸到遠程計算機。
  • 您可能需要將實例傳輸到另一個AppDomain或進程在同一臺計算機上。

對於其中的每一個,都必須有一些可以存儲,通信,然後用來重構原始對象的串行位表示。將對象轉換爲這一系列位的過程稱爲「序列化」,而將一系列位轉換爲原始對象的過程稱爲「反序列化」。

以序列化形式表示對象的實際表示形式可能因您的目標不同而有所不同。例如,在C#中,您同時具有XML序列化(通過XmlSerializer類)和二進制序列化(通過使用BinaryFormatter類)。根據您的需要,您甚至可以編寫自己的自定義序列化程序來執行額外的工作,例如壓縮或加密。如果你需要一種語言和平臺無關的序列化格式,你可以試試谷歌的Protocol Buffers,它現在有support for .NET(我沒有用過)。

上面提到的XML表示方式適用於以標準格式存儲對象,但根據您的需要它可以是冗長和緩慢的。二進制表示可以節省空間,但不像XML那樣可以跨語言和運行時移植。重要的一點是串行器和解串器必須相互理解。當您開始引入向後和向前兼容性和版本控制時,這可能是一個問題。

的潛在系列化兼容性問題的一個例子:

  • 你發佈你的程序,它是能夠序列化一些Foo對象文件的版本1.0。
  • 用戶執行一些操作將其Foo保存到文件中。
  • 您使用更新的Foo發佈程序的2.0版。
  • 用戶試圖用您的2.0版程序打開1.0版文件。

如果2.0 Foo版本具有版本1.0 Foo沒有的附加屬性,則這可能很麻煩。你必須明確不支持這種情況,或者在你的序列化中有一些版本控制的故事。 .NET可以爲你做一些這樣的事情。在這種情況下,您可能也會遇到相反的問題:用戶可能會嘗試使用程序的版本1.0打開2.0版本的Foo文件。

我還沒有使用這些技術自己,但.NET 2.0和更高版本具有支持version tolerant serialization同時支持向前和向後兼容性:

  • 無關的或意外的數據的寬容。這使得該類型的更新版本可以將數據發送到舊版本。
  • 缺少可選數據的容差。這使舊版本可以將數據發送到更新的版本。
  • 序列化回調。這可以在數據丟失的情況下實現智能默認值設置。
+0

你可以給我一個場景或例子,其中的對象需要持續超出其存在的範圍? – FosterZ 2010-10-21 05:17:14

+0

哦,很好,謝謝 – FosterZ 2010-10-21 05:19:09

+0

thanx的附加信息'谷歌協議緩衝區'和'版本容忍序列化'。 – FosterZ 2010-10-21 06:26:15

1

不是類,但具體的對象可能被序列在一些持久性存儲器以存儲或對象/傳遞給另一個應用程序通過網絡。

2

例如,當您想通過網絡發送對象或將它們存儲到文件中時。

可以說你正在爲一個視頻遊戲創建一個Savegame格式。然後您可以使課程Player和每個Enemy可序列化。這樣可以很容易地將當前對象的狀態保存到文件中。另一方面,在爲遊戲編寫多人遊戲實現時,您可以將Player通過網絡序列化到其他客戶端,然後可以處理這些數據。

+0

你的例子很好..thnx – FosterZ 2010-10-21 05:26:43

1

例如,當你想發送一個對象到某個url時,你可能決定以xml格式發送它。從內存中的對象轉換(在本例中)xml的過程稱爲序列化。從xml轉換到內存被稱爲反序列化。

2

在非面向對象的語言中,通常會將數據以字節模式存儲在內存中,這些字節在沒有引用任何其他內容的情況下「有意義」。例如,圖形編輯器中的一組形狀可能只是將所有點連續存儲。在這樣的程序中,簡單地將所有數組的內容存儲到磁盤可能會產生一個文件,當讀回這些數組時,將產生原始數據。

在面向對象的語言中,許多對象存儲爲對其他對象的引用。僅僅存儲內存數據結構的內容將不會有用,因爲對對象#24601的引用不會說任何關於該對象所代表的內容。雖然面向對象的系統可以很好地找出內存中的數據「意味着什麼」並嘗試將其自動轉換爲合理的格式,但它無法識別對象引用之間的所有區別,到同一個對象,以及那些指向碰巧匹配的對象。因此在將對象轉換爲原始位流時常常需要幫助系統。

相關問題