首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机存取和BinaryWriter?

随机存取和BinaryWriter?
EN

Stack Overflow用户
提问于 2010-01-23 15:11:18
回答 1查看 1.1K关注 0票数 2

我正在进行一个项目,在这个项目中,我正在构建一个字节数组,它几乎就像对象图的序列化。每个类都负责编写自己的数据,因此我正在考虑使用BinaryWriter并将该实例传递给我的子对象,让它们将自己序列化到其中,而不是创建临时缓冲区(字节数组)并将它们合并。

但是,我需要在每个子数据前面加上一个字节,该字节指定以下块的大小,但这在子数据写入所有数据之前是不知道的,到那时,写入器定位在子数据的末尾。当然,我可以创建一个临时缓冲区,并将一个临时BinaryWriter传递给子BinaryWriter,然后再将数据写入“主”BinaryWriter,但这感觉就像是一种恶意解决方案。

有没有其他的解决办法?篡改BinaryWriter的位置可能是个坏主意吗?如果可能的话,我希望避免创建临时缓冲区/写入器,只要让每个子程序写入我的“主”编写器/缓冲区即可。

下面的解决方案可能有效,但有点麻烦。有没有更好的解决方案?(我还没有测试过它,所以可能没有完全对齐字节)

代码语言:javascript
复制
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);
       }
   }
}
EN

回答 1

Stack Overflow用户

发布于 2010-01-23 15:23:03

最近,我也遇到了一个非常类似的问题,我也意识到,似乎实际上只能有一个与特定流相关联的二进制编写器,因为一旦关闭一个二进制编写器(根据文档),流也会关闭。我没有比你描述的更好的解决办法了:

  1. 将数据写入MemoryStream,然后将内存流的大小和内容写入主流。如果您希望允许某些对象使用除当前位置的BinaryWriter.
  2. Remember以外的另一种类型的编写器,则编写0值,然后使用数据块,这可能非常方便。然后,返回到0值,并将其替换为书面大小,然后返回到末尾。

我选择了第一个选项,虽然我还没有完成我的实现,但是在写任何东西到流之前,知道将要写什么的大小会让我感觉更好。写虚拟的价值观,在溪流中跳跃,感觉更像是设计出来的。而且它可能更类似于BinaryWriter在内部编写字符串的方式。您是否或是否考虑过从BinaryWriter继承来添加您自己的写函数?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2123596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档