【发布时间】:2009-12-11 04:38:40
【问题描述】:
我正在编写一些将用于与 C# TCP 服务器通信的类,并且我正在使用 BinaryWriter 和 BinaryReader 编写序列化/反序列化方法。这很容易,但我遇到了这样一种情况,我有一个类 Class1,其中包含一个实例 Class2。这两个类都实现了定义方法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 调用的内容是什么?除了硬编码实现此接口的任何对象的大小之外,我不确定其他方法,但有没有更优雅的方法?我考虑过在运行时使用反射来计算它(缓存它以供将来调用),但这似乎更难看。
编辑:我应该指出,如果数据是可变长度的,那么二进制表示会在必要时包含数据长度,并且反序列化器会处理它。
【问题讨论】:
-
序列化通常不会产生固定长度的表示。使用受约束的流或任何其他接受接收端在完成读取之前不知道长度的方法可能会做得更好。
标签: c# serialization