私は、オブジェクト グラフのシリアル化にほぼ似たバイト配列を構築しているプロジェクトに取り組んでいます。各クラスは独自のデータを書き出す責任があるため、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);
}
}
}