我有14400360个结构阵列,每个结构由3个字节的数据。 序列化固定大小的缓冲器
[ProtoContract]
struct A
{
[ProtoMember(1)]
private unsafe fixed byte[3] data;
}
不幸的是protobuf网2.0.0.668不能序列固定大小的缓冲区,并在系列化抛出异常。 (如“不为串行FixedArray”的东西)我想答案是解释here。
我目前的解决方法是在固定阵列分成三个独立的字节和固定的布局。
[ProtoContract]
[StructLayout(LayoutKind.Explicit, Size = 3, CharSet = CharSet.Ansi)]
struct A
{
[ProtoMember(1)]
[FieldOffset(0)]
private byte data;
[ProtoMember(2)]
[FieldOffset(1)]
private byte data1;
[ProtoMember(3)]
[FieldOffset(2)]
private byte data2;
}
问:有一些黑魔法黑客或只是简单的技巧,我错过了,所以我没有手动拆分数组?
当测量含有此阵列的对象的堆的使用情况,它占用43201160个字节或每结构仅有3个字节。 磁盘上的序列化文件占用72,814,584字节或每个结构约5.05字节。
问:什么占用了每个结构这些额外的2个字节? 我还没有尝试过,但也许序列化的大小可以通过制作一个3 * 14,400,360字节的数组来减少呢? (超出不得已)
编辑:更正 序列化文件的大小为126246995个字节或每结构8.8字节而不是原来报每结构5.5个字节。
编辑:后续 从this answer使用单个成员恶作剧使文件大小降至90952228个字节或每结构6.3个字节。