2010-07-15 63 views
5

我面臨以下問題。我需要(de)序列化(二進制)一個對象流到磁盤上的單個文件。序列化部分不是問題,只需在追加模式下打開流並使用.Net的BinaryFormatter序列化方法即可完成。這種方法的問題在於,我不能僅僅將此流傳遞給BinaryFormatter的反序列化函數,它所包含的不是我已序列化的對象的單個實例。二進制(De)序列化一個對象流到一個文件

是否存在此問題的常見解決方案?序列化到給定流的所有對象都是相同類型的,所以至少我們不需要弄清楚什麼是反序列化,這是給定的,但似乎並沒有爲我提供一條出路。

澄清基於答覆:在預期要大發對象的數量,並因此不可能保持他們都在一個包裝集合(如刷新到磁盤需要將它們全部加載到內存中 - >添加新的 - >刷新到磁盤)。

  • 通常,當你序列化一個對象,你得到一個包含文件:

[對象]

  • 我所創造的是包含一個文件:

[對象] [對象] [對象] [對象] ... [對象]

而且我需要反序列化各個對象實例。

在此先感謝!

答:因爲答案在這個線程(有足夠的清晰度)提到,但從來沒有明確說明,我以爲我會在這裏聲明它:

while (fileStream.Position < fileStream.Length) 
    messages.Add((Message)formatter.Deserialize(fileStream)); 

的BinaryFormatter的反序列化將一個對象根據需要:)您可能需要緩存fileStream.Length屬性,因爲每次調用屬性時都會重新計算長度,從而減慢速度。我不知道爲什麼在發佈這個問題之前我第一次嘗試它時沒有工作,但它現在確實無誤地工作。

回答

1

嘗試把你的對象變成一個序列化的集合(我相信列表是可序列化),然後響應澄清(反)序列對象

編輯: 我剛剛意識到這個問題有相同的答案作爲question。而不是試圖重新創造一個答案,我只是看看馬克Gravell的答案,或者this one

+0

對象在系統的生命週期中流入,並且存在其中的很大數量,我需要衝洗。將它們保存在包裝器集合中時,我將不得不將它們全部保存在內存中,並且每次我要刷新到磁盤時都要重新寫入整個文件。 – United 2010-07-15 17:50:28

+0

第一個建議不起作用,因爲需要另一個庫(如果我運氣好的話,通過合法的6個月+審批流程)。第二個是有趣的。對於第二個答案,看起來他們已經有了正常的序列化來從一個文件反序列化一系列對象,而這些對象不在集合中。在我的測試中不起作用,所以我想我會試着進一步研究它,或者在那個問題中跟進。 – United 2010-07-15 20:29:45

0

的文件序列化,所以我想直接將您的流文件會做什麼,你似乎想要。更具體的解釋你的情況將有助於提供更有用的答案。 (我希望我可以將它作爲'評論'輸入,但不知何故評論按鈕不適用於我。)

+0

序列化不是問題。問題是,如果我一次序列化一個對象(我必須)並將它們追加到一個流中,我無法反序列化結果流,因爲整個流不代表單個對象。 – United 2010-07-15 18:07:56

+0

基本上,通常當你序列化一個對象到一個文件時,該文件將包含這個對象(即[Object]),所以要反序列化你做的事Object obj = binaryFormatter.Deserialize(fs,MyObjType);我所擁有的是[Object] [Object] ... [Object]形式的文件,所以我不能僅僅在這個文件上調用反序列化函數,因爲我提供的反序列化器不是單個對象的序列化。 – United 2010-07-15 19:13:11

+0

我在想什麼是把一些分隔符(它提供了一個串行器永遠不會產生的符號組合)。這樣我就可以在一個流中手動將文件解析爲塊(表示單個序列化對象),並將塊分配給另一個流,然後反饋給解串器。 – United 2010-07-15 19:16:48

相關問題