[英]why we can't Serialize these objects?
為什么我們不能將對象序列化為隨機訪問文件? 另一方面,我們可以將對象序列化為順序訪問文件?
“” C#沒有提供在運行時獲取對象大小的方法。 這意味着,如果我們序列化該類,我們將無法保證固定長度的記錄大小“”(來自我讀過的書)。
因此我們無法讀取隨機訪問文件,因為我們不知道文件中的每個對象大小,因此我們該怎么做?
任何標有SerializableAttribute
屬性的對象都可以序列化(在大多數情況下)。 序列化的結果始終指向流,該流很可能是文件輸出流。
您是在問為什么對象圖不能部分反序列化嗎? .NET序列化僅可[反序列化]完整的對象圖。 否則,您將不得不轉向其他序列化格式化程序,或者編寫自己的格式化程序。
要直接隨機訪問文件,必須使用支持查找的流打開文件。
編輯:
從序列化中尋求結果流沒有任何實際目的-只有序列化格式化程序才知道其中有什么,並且應該始終在流的開始就得到反饋。
用於將數據持久化為其他結構; 為此,請分兩個階段進行操作:首先,將序列化字節定向到[即有內存支持的]流,您隨后可以從中讀取大小,然后使用所說的大小知識將數據寫入實際的后備存儲中。
您無法預測序列化對象的大小,因為序列化表示形式可能與運行時表示形式相差很大。
如果僅使用基本類型,並且使用BinaryWriter進行編寫,那么仍然有可能實現對輸出大小的精確控制-但這本身不是序列化。
.NET中的默認二進制序列化會序列化整個對象圖,從本質上來說,它是一個圖,它沒有恆定的大小,這意味着每個序列化對象(記錄)都沒有恆定的大小,從而阻止了隨機訪問。
為了能夠隨機訪問文件中的任何記錄,請編寫您自己的類的二進制序列化的實現,或使用數據庫。 如果您需要一個簡單的,無需安裝的單線程數據庫引擎,請查看SQL Server Compact 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.