2

私は、オブジェクト グラフのシリアル化にほぼ似たバイト配列を構築しているプロジェクトに取り組んでいます。各クラスは独自のデータを書き出す責任があるため、BinaryWriter を使用してそのインスタンスを子オブジェクトに渡し、一時バッファー (バイト配列) を作成してそれらをマージする代わりに、これにシリアル化することを考えています。

ただし、次のブロックのサイズを指定するバイトを各 childdata の先頭に追加する必要がありますが、それは子がすべてのデータを書き込むまでわかりません。その時までに、ライターは childdata の最後に配置されます。もちろん、一時バッファを作成して一時 BinaryWriter を子に渡し、その後「メイン」の BinaryWriter にデータを書き込むこともできますが、それはハックな解決策のように感じます。

代替ソリューションはありますか?BinaryWriter の位置を改ざんするのは悪い考えでしょうか? 可能であれば、一時的なバッファー/ライターの作成を避け、各子に「メイン」のライター/バッファーに書き込むようにしたいと思います。

以下の解決策はうまくいくかもしれませんが、少しハックです。より良い解決策はありますか?(私はそれをテストしていないので、おそらく完全にバイトアライメントされていないでしょう)

public abstract class BaseObject 
{
      public abstract void Serialize(BinaryWriter writer);
}



public class Program() 
{

  public static void Main() 
  {
       List<BaseObject> myChildren = new List<BaseObject>();

       // ... Initialize children here..

       MemoryStream memoryStream = new MemoryStream();
       BinaryWriter writer = new BinaryWriter(memoryStream);

       foreach (BaseObject child in myChildren) {
           writer.Write((byte)0); // Dummy placeholder. Length is a byte
           long sizePosition = writer.BaseStream.Position;
           child.Serialize(writer);
           long currentPosition = writer.BaseStream.Position;
           writer.Seek(sizePosition, SeekOrigin.Begin);
           writer.Write((byte)currentPosition-sizePosition);
           writer.Seek(currentPosition , SeekOrigin.Begin);
       }
   }
}
4

1 に答える 1

2

私も最近非常によく似た質問で困惑し、特定のストリームに関連付けられたバイナリライターを実際には1つだけ持つことができる/すべきであることに気付きました.1つのバイナリライターを閉じるとすぐに(ドキュメントによると)ストリームはも閉鎖。あなたが説明したものよりも良い解決策は思いつきませんでした:

  1. データを MemoryStream に書き込み、メモリ ストリームのサイズと内容をメイン ストリームに書き込みます。これは、一部のオブジェクトが BinaryWriter 以外の別の種類のライターを使用できるようにする場合に便利です。
  2. 現在の位置を記憶し、0 の値を書き、次にデータ ブロックを書きます。その後、0 の値に巻き戻し、書き込まれたサイズに置き換えてから、最後に戻ります。

選択肢 1 を選択しました。実装はまだ完了していませんが、ストリームに何かを書き込む前に、書き込まれる内容のサイズを知っておくとよいと思います。ダミーの値を書き込んでストリームを飛び回るのは、より不自然に感じます。BinaryWriter が文字列を内部的に書き込む方法におそらく似ています。独自の書き込み関数を追加するために BinaryWriter を継承していますか、または検討したことがありますか?

于 2010-01-23T15:23:03.343 に答える