我正在进行一个项目,在这个项目中,我正在构建一个字节数组,它几乎就像对象图的序列化。每个类都负责编写自己的数据,因此我正在考虑使用BinaryWriter并将该实例传递给我的子对象,让它们将自己序列化到其中,而不是创建临时缓冲区(字节数组)并将它们合并。
但是,我需要在每个子数据前面加上一个字节,该字节指定以下块的大小,但这在子数据写入所有数据之前是不知道的,到那时,写入器定位在子数据的末尾。当然,我可以创建一个临时缓冲区,并将一个临时BinaryWriter传递给子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);
}
}
}发布于 2010-01-23 15:23:03
最近,我也遇到了一个非常类似的问题,我也意识到,似乎实际上只能有一个与特定流相关联的二进制编写器,因为一旦关闭一个二进制编写器(根据文档),流也会关闭。我没有比你描述的更好的解决办法了:
我选择了第一个选项,虽然我还没有完成我的实现,但是在写任何东西到流之前,知道将要写什么的大小会让我感觉更好。写虚拟的价值观,在溪流中跳跃,感觉更像是设计出来的。而且它可能更类似于BinaryWriter在内部编写字符串的方式。您是否或是否考虑过从BinaryWriter继承来添加您自己的写函数?
https://stackoverflow.com/questions/2123596
复制相似问题