2009-04-21 105 views
2

對象序列化如何工作?如何將對象反序列化並從序列化日期創建實例而不調用任何構造函數?對象序列化

+0

http://forum.codecall.net/csharp-tutorials/7918-tutorial-visual-studio-2008-c-serialization.html – 2009-04-21 19:30:14

+0

讓我知道如果這不是你的答案.. – 2009-04-21 19:32:06

回答

6

我已經保持這個答案語言不可知,因爲沒有給出一種語言。

當對象被序列化時,所有需要的信息重新編譯都可以被檢索到。這通常包括對象的類型以及所有實例變量的值。

當對象被反序列化時,分配正確大小的內存區域並使用序列化信息填充,以便新對象與序列化信息相同。

正在運行的程序可以在內存中引用這個新對象,而無需實際調用構造函數。

這裏有很多小細節沒有解釋,但這是序列化/反序列化的總體思路。

0

您是否在談論Java?如果是這樣,序列化是一種超常的對象創建機制。這是一個使用本地代碼創建對象而不調用任何構造函數的後門。因此,在設計可序列化類時,需要確保通過反序列化創建的類與通過構造函數路徑保持相同的不變量(要被初始化的鍵字段)。在Java中創建對象的第三種方法是克隆,並應用類似的問題。

如果您需要將該字段的值設置爲與克隆或反序列化過程返回的值不同,克隆和序列化不會與最終字段的使用互動。

Josh Bloch的「Effective Java」有一些章節更深入地解釋了這些問題。

(這個答案可以適用於其他語言也一樣,但我只在Java中使用序列化)

0

關於.NET:這不是一個明確的或教科書的答案,我可能會全力以赴的錯...

.NET序列化需要分解成二進制與其他(XML或XML衍生通常)。二進制序列化對我來說大多是一個黑盒子,但它允許對象在當前狀態下序列化和恢復。 XML序列化通常僅序列化對象的公共字段/屬性,除非通過添加自定義ISerializable實現來重寫。

在XML序列化的情況下,我相信.NET使用反射來確定哪些字段和屬性轉換爲它們的等效元素。添加[XMLSerializable]屬性將實現一個默認行爲,可以通過在字段級別應用其他屬性(如[XMLAttribute])來進行調整。

元數據(Reflection依賴於)存儲所有對象成員以及它們的屬性和地址,這允許序列化程序確定它應該如何構建輸出。