gpt4 book ai didi

c# - 随机访问和 BinaryWriter?

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:03 25 4
gpt4 key购买 nike

我正在开展一个项目,我正在构建一个几乎类似于对象图序列化的字节数组。每个类负责写出它自己的数据,所以我正在考虑使用 BinaryWriter 并将该实例传递给我的子对象并让它们将自己序列化到这个而不是创建临时缓冲区(字节数组)并合并它们。

然而,我需要在每个子数据前添加一个指定后续 block 大小的字节,但直到子数据写入所有数据后才知道,到那时,写入器位于数据 block 的末尾子数据。我当然可以创建一个临时缓冲区并将临时 BinaryWriter 传递给 child ,然后将数据写入“主”BinaryWriter,但这感觉像是一个 hackish 解决方案。

是否有任何替代解决方案?篡改 BinaryWriter 的位置可能是个坏主意吗?如果可能的话,我想避免创建临时缓冲区/写入器,只让每个 child 写入我的“主要”写入器/缓冲区

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

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);
}
}
}

最佳答案

我最近也被一个非常相似的问题难住了,并且还意识到似乎你可以/应该实际上也只有一个二进制写入器与一个特定的流相关联,因为一旦你关闭一个二进制写入器(根据文档)流也被关闭。我没有想出比你描述的更好的解决方案:

  1. 将数据写入内存流,然后将内存流的大小和内容写入主流。如果您想允许某些对象使用除 BinaryWriter 之外的另一种编写器,这可能会很方便。
  2. 记住你当前的位置,写一个0值,然后是数据 block 。之后倒退到0值,替换成写入的大小,然后回到最后。

我选择了选项 1。虽然我还没有完成我的实现,但在向流写入任何内容之前知道将要写入的内容的大小对我来说感觉更好。编写虚拟值并在流中跳跃感觉更做作。它可能更类似于 BinaryWriter 在内部写入字符串的方式。您是否或是否考虑过从 BinaryWriter 继承以添加您自己的 Write 函数?

关于c# - 随机访问和 BinaryWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2123596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com