gpt4 book ai didi

c# - 获取二进制序列化类大小的好方法

转载 作者:行者123 更新时间:2023-11-30 20:13:08 26 4
gpt4 key购买 nike

我正在编写一些将用于与 C# TCP 服务器通信的类,并且我正在使用 BinaryWriterBinaryReader 编写序列化/反序列化方法.这很简单,但是我遇到了这样一种情况,我有一个类 Class1,其中包含一个实例 Class2。这两个类都实现了一个接口(interface),该接口(interface)定义了方法 byte[] ToBytes()void FromBytes(byte[] data)。所以我得到了这段代码:

public class Class1
{
public int Action;
public Class2 Data;

public void FromBytes(byte[] data)
{
BinaryReader br = new BinaryReader(new MemoryStream(data));
Action= br.ReadInt32();
Data = new Class2();
Data.FromBytes(br.ReadBytes(___));
br.Close();
}
}

问题是,什么进入了 ReadBytes 调用?除了对实现此接口(interface)的任何对象的大小进行硬编码之外,我不确定有什么方法可以做到这一点,但是有没有更优雅的方法呢?我考虑过在运行时使用反射来计算它(缓存它以供将来调用),但这看起来更丑陋。

编辑:我应该指出,如果数据是可变长度的,则二进制表示在必要时包括数据长度,反序列化器会处理它。

最佳答案

通常,我不会传递 byte[],而是传递 Stream(可能是约束流,以阻止它读取我们预期区域之外的内容)或包装阅读器,并使用它 - 即让类(class)阅读它需要的内容。

另一个简单的选择是在序列化期间为数据添加长度前缀,这样您就可以提前知道大小。

或者,省去很多麻烦并使用预滚动的二进制序列化框架。有几个……他们都不得不解决这个问题。很乐意提供建议(这是我的宠物区)。

我也担心你类的关注点分离,但这是一个附带问题。

关于c# - 获取二进制序列化类大小的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1883603/

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