简单类我指的是不包含向量,堆栈,链表或任何其他可变长度数据结构的类/结构。
如果我们有一个带有一些简单的double,long,int,...字段的类,那么这个类的不同实例的序列化大小是否取决于这些字段的值? (例如,根据有意义的位数,如果忽略左侧0位以节省空间)
字符串如何影响序列化数据的大小?
答案 0 :(得分:1)
您需要先阅读wire format documentation。
浮点字段的大小将始终固定,但对于整数,有以下选项:fixed32
和fixed64
将被修复(顾名思义),但int32
,{ {1}},int64
,sint32
,sint64
和uint32
是可变长度的,旨在使小值的编码更有效。
字符串被编码为UTF-8编码数据的长度,然后是数据本身。长度本身以可变长度格式序列化,同样可以有效地编码短字符串。
答案 1 :(得分:1)
1:不,通常不会修复。默认情况下,int
和long
(以及其他一些)使用“varint”编码(直线或锯齿形)进行编码,这种编码旨在优化小幅度 - 它是7-第8位的位编码用作连续标志。但是,有些选项允许您对同一数据使用固定大小(4字节或8字节)编码 - DataFormat
上的ProtoMemberAttribute
开关控制此操作。 double
总是占用8个字节。此外,某些字段可能是可选的(可以为空,具有默认值,或者使用条件序列化),在这种情况下,消息中的字段数是可变的。
2:使用UTF-8对字符串进行二进制编码,然后将字节数写为“varint”,后跟有效负载字节 - 所以字符串的长度和使用的特定字符(因为UTF-8)本身每个字符使用不同数量的字节,具体取决于字符),极大地影响了结果的长度。