2010-03-04 63 views
3

HI 這是我的場景,我必須序列化一個對象到一個文件。面對序列化問題

我使用的BinaryFormatter將對象序列如,

  IFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(stream1, object); 

我書面方式GetObjectData使用()如下,

  serinfo.AddValue("string1",objecta); 
      serinfo.AddValue("string2",objectb); 
      serinfo.AddValue("string3",objectc); 

我序列化2所列出LIST1,list2中在對象B。 (每個列表也可能有100000個元素,意味着列表中的元素數目會影響流的大小),所以當我序列化對象時,我的流大小不應超過10MB,如果它超過我應該寫在另一個流。簡單地說,如果大小超過10MB,我應該有一個更流,每個流應在以下格式

stream1 --> objecta,(objectb)some n values in list,objectc 
stream2 --> objecta,(objectb)values in list from n+1 to some m,objectc 
.. 
streamn --> ........ 

每個流的大小應限制爲10MB ..

請給我提供了一些線索這樣做.. 在此先感謝.. (首先感謝閱讀這個大的.. .. P)

回答

1

我想我會序列化我的對象到MemoryStream,然後檢查是否將它添加到當前文件流將超過10MB,並在寫入之前開始新的流,如果它會。

0

你不能直接這樣做,因爲只有一個流可以傳遞給Serialize方法。或者使用MemoryStream作爲目標,然後手動傳播到流或在序列化之前將初始對象分割成幾部分。

+0

你的意思是「不能」? –

+0

手動意味着什麼? – sandhya

+0

我的意思是,我怎麼能不知道每個子對象的大小而傳播? – sandhya

0

我建議您將流與串行化分離。也就是說,序列化爲一個流(無論長度是多少),並將這個流分成10Mb的塊。

+0

難道這種方法要麼將對象序列化的內存需求加倍,要麼導致一些不需要的IO操作? – Jens

+0

不一定。您可以先序列化爲內存,然後在寫入文件流時分割數據 - 因此不需要額外的IO。如果您使用MemoryStream作爲緩衝區 - 從一開始就讀取並在同一操作中寫入結尾 - 您不需要將所有數據保存在內存中。會有一些開銷,但它肯定不應該增加所需內存的兩倍。總而言之:當我說「分開」時,這並不一定意味着「一個接一個」 - 只是在單獨的代碼段中。 –

+0

寫完單個流後,我怎麼知道每個子對象的長度? (這裏我需要每個流中的objecta和objectc)。 – sandhya