我的问题是,是否可以确定引用类型的序列化大小(以字节为单位)。确定.NET类型的序列化大小和非托管内存效率
继承人的情况:
我使用BinaryFormatter类序列化的基本.NET类型,即例如:
[Serializable]
public class Foo
{
public string Foo1 { get; set; }
public string Foo2 { get; set; }
}
我序列化每个项目一个byte [],然后补充说,段到现有字节[]的末尾,并在每个段末尾添加一个回车符以分隔对象。
为了反序列化我用Marshal.ReadByte()如下:
List<byte> buffer = new List<byte>();
for (int i = 0; i < MapSize; i++)
{
byte b = Marshal.ReadByte(readPtr , i);
if (b != delim) // read until encounter a carriage return
buffer.Add(b);
else
break;
}
readPtr = readPtr + buffer.Count + 1; // incrementing the pointer for the next object
return buffer.ToArray();
我相信使用Marshal.Copy()会更有效,但我需要知道序列化的字节段的长度提前。有没有一种方法可以从序列化的类型中可靠地计算出来,或者我可以使用的整体更有效的方法?
另外,最终使用回车将不可靠。所以我想知道是否有更标准的方法来分隔对象,无论是通过自定义BinaryFormatter还是使用其他标准化的最佳实践?例如,如果BinaryFormatter的序列化说是一个通用列表<>,那么BinaryFormatter是如何划分对象的?
这很危险;如果串行数据本身出现值为13的字节会怎么样?国际海事组织你应**前缀长度使用类似固定长度(通常4或8字节)网络字节顺序编码,或“varint”编码,如果你感到异国情调 – 2012-04-13 21:23:25
@MarcGravell,谢谢..我使用回车作为临时解决方案。前缀长度的想法很好,我想用它。 – 2012-04-13 21:36:05
根本没有必要做长度分隔。 BinaryFormatter知道它何时对一个完整的机箱进行反序列化。 – 2012-04-13 21:42:29