2013-05-07 19 views
5

指定された場所にファイルを作成するエラーロギングライブラリを作成して、そのファイルにエラー情報を保存します。このエラー情報は、別のタスクプログラムによって読み込み可能ですこのライブラリで。複数のオブジェクトのシリアライズと逆シリアル化

私が保存している方法は、ファイルにErrorEntryというクラスをシリアル化してファイルの最後に追加するバイナリ形式(BinaryFormatter()FileStream()を使用)です。これは、一連のErrorEntriesが連続していることを意味します。すべての情報をファイルからリストに読み込み、エントリを追加してから、ファイルに保存してリソースをダンプする必要があるので、リストとしてはありません。単一の書き込みコマンドを実行するだけで、各オブジェクトをシリアル化された独自のオブジェクトとして格納すれば、はるかに効果的です。

私の問題は、リストまたは個々のオブジェクトをシリアライズするにはいくつかの例がありますが、複数のオブジェクトには何もありません。私は個々のオブジェクトとしてそれらを保存するが、私はそれらを読み込むときに、オブジェクトを読み取り、そのオブジェクトのリストとしてシリーズを返したい。

while(!EOF) 
{ 
    //deserialize each object 
    //add individual object to a list 
} 
//return the list of objects 

1つのファイルから各オブジェクトをデシリアライズする方法を教えてください。上記のものが動作する内部マーカーがあり、ファイルの最後であるかどうかを検出するだけで済むか、それを読むために他の何かをする必要がありますか?

+0

は、なぜあなたは単に '一覧'にすべてのこれらのオブジェクトを入れて、そのデータ構造をシリアル化していませんか?あなたは、「分離している」と考えられるオブジェクト間の相互依存性のようなコーナーケースをたくさん防ぎます。 –

+0

@OndrejTucny彼は以前のすべてのエントリをロードせずにファイルに追加したい。 – weston

+0

彼はなぜ、それは妥当だと言った。オブジェクトレベルで直列化解除するには、各エントリの後にデリミタシーケンスを記述し、ファイルを読み込むときにそれに反応する必要があります。 – Tommi

答えて

6

FileStream fs;で、fs.Position!=fs.Lengthを使用してEOFを検出できます。

追加するときは、新しいエントリを書き込む前に最後に移動するには、FileMode.Appendまたはfs.Seek(0, SeekOrigin.End);を使用してください。フルで

デシリアライズ:

public static ICollection<T> DeserializeList<T>(FileStream fs) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    List<T> list = new List<T>(); 
    while(fs.Position!=fs.Length) 
    { 
     //deserialize each object in the file 
     var deserialized = (T)bf.Deserialize(fs); 
     //add individual object to a list 
     list.Add(deserialized); 
    } 
    //return the list of objects 
    return list; 
} 
+1

このファイルからオブジェクトを逆シリアル化するのはどうですか?あなたがappendを使って多くのオブジェクトをファイルに直列化できるという事実は、それらを逆直列化できることを保証するものではありません。 – Artemix

+0

@Artemix編集を参照してください。問題の彼のコードに基づいて。そこに何か問題はありますか? – weston

+0

は、単にfilemode.appendを使用してから作業をしていませんか?または、私はfilemode.appendとfs.seekと言う必要がありますか? –

関連する問題