是否为简单类固定了protobuf序列化数据的大小?

时间:2013-12-12 06:44:30

标签: protobuf-net

简单类我指的是不包含向量,堆栈,链表或任何其他可变长度数据结构的类/结构。

  1. 如果我们有一个带有一些简单的double,long,int,...字段的类,那么这个类的不同实例的序列化大小是否取决于这些字段的值? (例如,根据有意义的位数,如果忽略左侧0位以节省空间)

  2. 字符串如何影响序列化数据的大小?

2 个答案:

答案 0 :(得分:1)

您需要先阅读wire format documentation

浮点字段的大小将始终固定,但对于整数,有以下选项:fixed32fixed64将被修复(顾名思义),但int32,{ {1}},int64sint32sint64uint32是可变长度的,旨在使小值的编码更有效。

字符串被编码为UTF-8编码数据的长度,然后是数据本身。长度本身以可变长度格式序列化,同样可以有效地编码短字符串。

答案 1 :(得分:1)

1:不,通常不会修复。默认情况下,intlong(以及其他一些)使用“varint”编码(直线或锯齿形)进行编码,这种编码旨在优化小幅度 - 它是7-第8位的位编码用作连续标志。但是,有些选项允许您对同一数据使用固定大小(4字节或8字节)编码 - DataFormat上的ProtoMemberAttribute开关控制此操作。 double总是占用8个字节。此外,某些字段可能是可选的(可以为空,具有默认值,或者使用条件序列化),在这种情况下,消息中的字段数是可变的。

2:使用UTF-8对字符串进行二进制编码,然后将字节数写为“varint”,后跟有效负载字节 - 所以字符串的长度和使用的特定字符(因为UTF-8)本身每个字符使用不同数量的字节,具体取决于字符),极大地影响了结果的长度。