我有一个protobuf结构Data
在.proto
中:
message Data {
uint64 ID = 1;
uint32 GUID = 2;
}
在golang
b, err := proto.Marshal(&pb.Data{})
if err != nil {
panic(err)
}
fmt.Println(len(b))
我的长度为0
!
我该如何使proto.Marshal始终返回固定大小,无论pb.Data是什么?
ps。
pb。数据仅包含int64
和int32
答案 0 :(得分:1)
这里有两个问题
1)protobuf对整数使用varint编码,因此大小取决于值,请参见this link
2)默认情况下,不传输零值字段,因此,因为两个整数均为零,所以甚至不发送其字段标识符。实际上,我不确定甚至没有选择发送the docs
的零值如果将它们都设置为1,您将拥有超过零个字节,但长度仍然不会固定,具体取决于值的范围
因此,通常没有真正的方法可以在protobuf消息中强制使用固定大小
如果您希望使用固定长度的消息,则最好使用直接在线结构类型编码,但这对于语言互操作而言会更加困难,因为它们都必须定义相同的消息,并且您会迷失方向轻松的消息迁移以及protobuf提供的所有出色功能。
Cap'n Proto可以为固定大小的结构提供一个选项,但是它们通常也进行压缩,这将再次产生可变长度的消息。
如果您描述了最终要解决的问题,我们也许可以提出其他替代方案。
答案 1 :(得分:0)
您正在字节数组上调用len()
。它将计算该数组中的元素数量,并返回它。
如果您刚刚实例化了一个新的,空的,protobuf指针对象,里面没有任何东西,则经过编组的字节数组将不保存任何数据,这就是为什么要获取0
的原因。
我不确定您要它返回什么。您能否进一步说明您想要的输出内容是什么?我也许可以更好地回答你的问题。