Google协议缓冲区和ASN.1(具有PER编码)之间最明显的区别是什么?对于我的项目,最重要的问题是序列化数据的大小。有没有人做过两者之间的数据大小比较?
距离我完成ASN.1的工作已经很长时间了,但是大小很可能取决于类型和实际数据的详细信息。
[我会[[强烈建议您将两者都原型化并放入一些实际数据进行比较。
如果协议缓冲区将包含重复的原始类型,则应查看Subversion中协议缓冲区的最新来源-它们现在可以以“打包”格式表示,这样可以节省更多空间。 (我的C#端口已经在上周的某个时间just
赶上了此功能。)repeated
,primitive numeric type
的read this字段,以获取更多信息。这是一个问题,例如如果您有以下类型的消息:(注释定义了实际值的范围)
message P{
required sint32 x = 1; // -0x1ffff to 0x20000
required sint32 y = 2; // -0x1ffff to 0x20000
required sint32 z = 3; // -0x319c to 0x3200
}
message Array{
repeated P ps = 1;
optional uint32 somemoredata = 2;
}
[如果您的数组长度为例如32,则将导致带有protobuf的打包消息大小约为250到450字节,这取决于数组实际包含的值。如果您使用完整的32位范围或,如果使用
原始数据Blob(假设z可以定义为int32
而不是sint32
并且具有负值,则甚至可以增加到1000字节以上。int16
值)将仅消耗320字节,因此ASN.1
消息总是小于320字节,因为最大值是实际上不是32位,而是19位(x,y)和15位(z)。protobuf消息的大小可以使用以下消息定义进行优化:
message Ps{ repeated sint32 xs = 1 [packed=true]; repeated sint32 ys = 2 [packed=true]; repeated sint32 zs = 3 [packed=true]; } message Array{ required Ps ps = 1; optional uint32 somemoredata = 2; }
这将导致消息大小在大约100字节(所有值均为零),300字节(最大范围内的值)和500字节(所有值均为32位高值)之间。