2009-04-29 1 views
11

私はBinaryFomatterでシリアル化されたオブジェクトを含むファイルを持っているとしましょう。今私は、別のオブジェクトをシリアル化し、その既存のファイルにこれをAPPENDすることができるようにしたい。既存のファイルにシリアル化する方法は?

どうすればいいですか?コレクション(例えばリスト<YourObjectType>)への最初のオブジェクトを追加し、メモリ内のオブジェクトへのあなたの最初のファイルの内容Deserialiseこの

についてですどのように

答えて

2

まず、オブジェクトの配列を格納することが本当に必要な場合は、それらをコンテナに入れ、コンテナをシリアル化します。今

、あなたが本当に連結単一のファイルに2つの直列化されたオブジェクトを保存したい場合:

私は、これは「箱の外」ことが可能であることがわからないんだけど、あなたは2つのことを行うことができます。ファイル(# 'オブジェクトの内容を記述したファイルのあなたが最初(または最後)の小さなヘッダを書きますする

  1. 使用、または独自の半tarファイル形式を発明し、とサイズ)。

  2. シリアライズされた各オブジェクトの最初と最後を検出するC#コードを記述します。私はそれが可能であることが完全にはわかりません。 Hereは、シリアル化形式の非公式な文書です。ヘッダーが含まれていますが、このヘッダーがファイルに表示されないという保証はありません。

2

、そのコレクションに新しいオブジェクトを追加することは、その後、コレクションをシリアライズ(現在2つのオブジェクトを含む)を既存のファイルの上に置きます。

4

オブジェクトをコレクションオブジェクトに入れ、そのようにシリアライズします。既存のファイルの最後にオブジェクトのバイナリ表現を追加すると、それを読み戻す際に問題が発生します。

+0

私はちょうど言ったことだと確信しています – tomfanning

+1

確かに同じです。しかし、同時に答えを書くことが可能であり、他の答えを見ることなくほとんど同じ時間に投稿することができることを忘れないでください。 ;) – paweloque

+0

私はそう思います:-) – tomfanning

3

実際には、ストリームを書き込み用に開いてポインタをストリームの最後に配置すると、別のオブジェクトをシリアル化して既存のストリームに追加することができます。

逆シリアル化もオブジェクトの前を読み込みますが、これ以上は読み込まれません。

明らかに、オブジェクトにランダムアクセスする(オブジェクト番号17以外のオブジェクトを逆シリアル化する)場合は、各オブジェクトが開始する位置のインデックスが必要ですが、すべてのオブジェクト最初から、お互いの後にそれらを直列化することができます。

+0

そして、あなたはそれをどのようにアフターワースにデシリアライズしますか? .NETはヘッダーからシリアル化されたオブジェクトサイズを知っていますか? –

+0

これは非常に良い質問です。私は非常にそれを疑う。 –

+0

はい、そうです。 –

19

これは確かに可能です。以下のコードは、オブジェクトを追加します。

using (var fileStream = new FileStream("C:\file.dat", FileMode.Append)) 
{ 
    var bFormatter = new BinaryFormatter(); 
    bFormatter.Serialize(fileStream, objectToSerialize); 
} 

次のコードは、オブジェクトを逆シリアル化します。

var list = new List<ObjectToSerialize>();  

using (var fileStream = new FileStream("C:\file.dat", FileMode.Open)) 
{ 
    var bFormatter = new BinaryFormatter(); 
    while (fileStream.Position != fileStream.Length) 
    { 
     list.Add((ObjectToSerialize)bFormatter.Deserialize(fileStream)); 
    } 
} 

このファイルには、同じオブジェクトのみが含まれている必要があります。

+0

このコードを試しましたか?最後に追加された部分だけをデシリアライズするようです。ここに私のテストコードhttp://pastebin.com/EV4rPaT4 – mrgloom

+1

こんにちはmrgloomです。これはほぼ4歳ですが、問題なく生産に使用されました。私はあなたのテストコードを見てきました。既存のものを追加しない3つの別々のリストをシリアライズしています。デシリアライズするときは、各リストオブジェクトを最新のオブジェクトで上書きします。 22行目をlist.AddRange((List )bFormatter.Deserialize(fileStream))に変更してみてください。がんばろう。 – Magpie

+0

ありがとう、それは素晴らしい作品!なぜ私は知りませんが:/ bFormatter.Deserializeは、ファイル内のObjectToSerializeの終了をいつ知ることができますか?デバッグ中、fileStream.Positionは、各ObjectToSerializeがファイル内で終了する位置で停止します。理由はわかりません... – Loaderon

関連する問題