2009-08-21 38 views
10

爲什麼不是每種類型的對象都可以隱式序列化?爲什麼不是每種類型的對象都可序列化?

在我有限的理解中,對象不是簡單地存儲在堆上,而是指向堆棧上的指針?

您不應該能夠以編程方式遍歷它們,將它們存儲爲通用格式,並且能夠從那裏重建它們?

+0

什麼語言,框架? – 2009-08-21 01:31:41

+1

我只是在問一般.. :-) – Matt 2009-08-21 01:36:29

回答

18

某些對象封裝資源,如文件指針或網絡套接字,這些資源不能被反序列化爲,而是將序列化包含它們的對象時所處的狀態。

舉例:你不應該反序列化 對象,充當身份驗證 數據庫連接,因爲這樣做, 你需要的序列化形式 包含明文密碼。這個 將不是一個好的做法,因爲 某人可能會保留已保存的 序列化表單。您還沒有 的想法,當你反序列化的 數據庫服務器仍在運行,可以 訪問,認證證書 仍然有效等

3

沒有,因爲有時你不具備的所有信息在你重建它們的地方。請記住,您可能不會在與您擁有的環境相同的環境中重建該對象;它可能是一個不同的機器,甚至不同的語言。

5

即使您只考慮不包含OS狀態的對象,問題也比乍看起來要困難。圖表可能有周期。實體可能來自多個頂級實體。

我試圖outline a universal serialization library in c in a previous answer,發現有一些困難的情況。

+0

對,可以有周期等,但這些都是解決的問題。與序列化窗口句柄或文件句柄的無意義相反。 – 2009-08-21 01:37:26

+0

@Steven Sudit:我會將它們描述爲「已知可解決」而非「已解決」。有必須作出的決定:在現在序列化的程度和後來的反序列化結構的相同程度之間進行權衡。不同的問題可能需要不同的選擇。所以這些問題有解決方案,但沒有單一的解決方案將適用於所有情況。這就是問題所在。 – dmckee 2009-08-21 02:04:05

+0

問題很難,但其他人已經爲我們解決了。例如,在.NET中,有一個完美可行的序列化系統,可以順利處理循環。其他平臺也有類似的解決方案。然而,他們沒有一個能做的就是序列化像手柄這樣的東西。這是一個更深層次的問題。 – 2009-08-21 04:13:06

0

從技術上講,內存空間中的任何對象都可以被序列化並持久保存到硬盤等持久性介質中。畢竟,大多數操作系統都會將活動內存分頁到磁盤,並且還有許多還具有休眠風格功能。問題是一個範圍,例如:你在你的內存空間中創建一個字符串對象,你的序列化和反序列化,你認爲合適。當你打開一個文件時,操作系統給你一個文件句柄,但是操作系統仍然擁有包含你有句柄的實際文件對象的文件系統。另一方面,文件系統驅動程序必須維護文件句柄和其他文件相關元數據的持久數據庫。

1

它將序列化一個包含網絡連接的對象並負責從Web服務器返回數據流的意義是多少?

如何反序列化它,這將如何工作?是否應該重新打開連接,重新下載文件?

1

在某種程度上,你的假設是正確的。

它必須能夠設定在程序中的所有對象的劃分成組

1)你有完整的信息,其允許完全解構和所述對象的重建。數字或字符串的數組,結構是很好的例子。

2)您有施工信息。您可以通過調用外部代碼來重建對象。一個文件就是一個很好的例子,但它要求你的程序有一個文件抽象來記住構造和狀態參數。我們可以例如保存文件的路徑和文件中的位置。但重建可能會失敗。 (例如,該文件被刪除或更改)

3)您沒有施工信息,該對象以某種方式隨機接收。

在這裏,爲了能夠完全序列化對象,我們必須從3)到2)到1)。 3)中的對象可以是類型2)的對象的屬性,並且可以通過成功重建類型2)對象來檢索。

然而,類型2)的對象必須通過序列化僅僅必須是類型1的構造信息來重構,例如數字和字符串,真實數據。

這整個方案看起來很昂貴,因爲如果我們想重建整個程序狀態,我們必須使用封裝類型2的對象的抽象。我們必須知道當一個物體不能被重建時我們做了什麼。此外,我們必須確保我們不混合這些類型的對象,我們不混合類型3或2的對象,我們期望收集類型1的對象。

相關問題