我面臨以下問題。我需要(de)序列化(二進制)一個對象流到磁盤上的單個文件。序列化部分不是問題,只需在追加模式下打開流並使用.Net的BinaryFormatter序列化方法即可完成。這種方法的問題在於,我不能僅僅將此流傳遞給BinaryFormatter的反序列化函數,它所包含的不是我已序列化的對象的單個實例。二進制(De)序列化一個對象流到一個文件
是否存在此問題的常見解決方案?序列化到給定流的所有對象都是相同類型的,所以至少我們不需要弄清楚什麼是反序列化,這是給定的,但似乎並沒有爲我提供一條出路。
澄清基於答覆:在預期要大發對象的數量,並因此不可能保持他們都在一個包裝集合(如刷新到磁盤需要將它們全部加載到內存中 - >添加新的 - >刷新到磁盤)。
- 通常,當你序列化一個對象,你得到一個包含文件:
[對象]
- 我所創造的是包含一個文件:
[對象] [對象] [對象] [對象] ... [對象]
而且我需要反序列化各個對象實例。
在此先感謝!
答:因爲答案在這個線程(有足夠的清晰度)提到,但從來沒有明確說明,我以爲我會在這裏聲明它:
while (fileStream.Position < fileStream.Length)
messages.Add((Message)formatter.Deserialize(fileStream));
的BinaryFormatter的反序列化將一個對象根據需要:)您可能需要緩存fileStream.Length屬性,因爲每次調用屬性時都會重新計算長度,從而減慢速度。我不知道爲什麼在發佈這個問題之前我第一次嘗試它時沒有工作,但它現在確實無誤地工作。
對象在系統的生命週期中流入,並且存在其中的很大數量,我需要衝洗。將它們保存在包裝器集合中時,我將不得不將它們全部保存在內存中,並且每次我要刷新到磁盤時都要重新寫入整個文件。 – United 2010-07-15 17:50:28
第一個建議不起作用,因爲需要另一個庫(如果我運氣好的話,通過合法的6個月+審批流程)。第二個是有趣的。對於第二個答案,看起來他們已經有了正常的序列化來從一個文件反序列化一系列對象,而這些對象不在集合中。在我的測試中不起作用,所以我想我會試着進一步研究它,或者在那個問題中跟進。 – United 2010-07-15 20:29:45