2009-08-23 131 views
0

爲什麼我們無法將對象序列化爲隨機訪問文件?另一方面,我們可以將對象序列化爲順序訪問文件?爲什麼我們不能序列化這些對象?

「」C#沒有提供在運行時獲取對象大小的方法。這意味着,如果我們序列化這個類,我們不能保證一個固定長度的記錄大小(「從我讀入的書中)」。

因此,我們不能讀取隨機存取文件,因爲我們不知道文件中的每個對象大小,所以我們如何才能找到??????

+3

你是什麼意思的「隨機訪問文件」。你可以序列化對象到任何繼承自'System.Stream'的類上。 – 2009-08-23 14:28:37

+0

你能否包含不起作用的示例代碼? – Richard 2009-08-23 14:52:10

+0

編輯後檢查問題。 – Sherif 2009-08-23 15:08:35

回答

2

標記爲SerializableAttribute屬性的任何對象都可以序列化(在大多數情況下)。序列化的結果總是定向到一個流,這很可能是一個文件輸出流。

你問爲什麼一個對象圖不能部分反序列化?只有.NET序列化[de]序列化完整的對象圖。否則,你將不得不轉向其他序列化格式化器,或者寫你自己的。

對於直接隨機訪問文件,您必須使用支持查找的流來打開該文件。

編輯:

從序列化所產生的數據流中尋找有沒有實際意義 - 只有serialiation格式化器知道在那裏有什麼呢,應該不停進食流的最開始。

用於將數據保存到其他結構中;在兩階段過程中進行:首先,將序列化字節定位到[即內存支持]流,您可以從之後讀取大小,然後使用所述大小知識將數據寫入實際的後備存儲。

您無法預測序列化對象的大小,因爲序列化表示形式可能與運行時表示形式有很大差異。

如果只使用原始類型,並且使用BinaryWriter編寫 - 但這不是序列化,它仍然可以實現對輸出大小的精確控制。

+0

「」C#沒有提供在運行時獲取對象大小的方法。這意味着,如果我們序列化這個類,我們不能保證一個固定長度的記錄「」(從我讀入的書中)。 所以我們不能讀取隨機訪問文件,因爲我們不知道文件中的每個對象的大小,所以我們如何才能找到?????? – Sherif 2009-08-23 15:07:32

+0

你總是可以序列化到一個流,從中你可以解讀寫入的字節數。 MemoryStream是一個很好的選擇。之後,數據可以通過其他方式保存,前綴或長度索引。 – 2009-08-23 15:37:32

0

.NET中的默認二進制序列化將整個對象圖序列化,該對象圖根據其圖形性質不具有常數大小,這意味着每個序列化對象(記錄)的大小不會是常量,防止隨機訪問。

爲了能夠隨機訪問文件中的任何記錄,編寫自己的類的二進制序列化實現或使用數據庫。如果您需要一個簡單的,沒有安裝的單線程數據庫引擎,請查看SQL Server Compact

+0

圖形在其序列化狀態下的大小非常穩定;) – 2009-08-23 15:49:50

+0

確實如此,但它與問題或我的答案沒有關係。在編譯時無法預測對象的序列化大小,因爲整個對象圖需要在運行時序列化。運行時的圖形大小無法保證。 – 2009-08-24 13:31:23

相關問題