固定大小的golang protobuf元帅空结构

时间:2018-10-23 13:02:54

标签: go proto

我有一个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。数据仅包含int64int32

2 个答案:

答案 0 :(得分:1)

这里有两个问题

1)protobuf对整数使用varint编码,因此大小取决于值,请参见this link

2)默认情况下,不传输零值字段,因此,因为两个整数均为零,所以甚至不发送其字段标识符。实际上,我不确定甚至没有选择发送the docs

的零值

如果将它们都设置为1,您将拥有超过零个字节,但长度仍然不会固定,具体取决于值的范围

因此,通常没有真正的方法可以在protobuf消息中强制使用固定大小

如果您希望使用固定长度的消息,则最好使用直接在线结构类型编码,但这对于语言互操作而言会更加困难,因为它们都必须定义相同的消息,并且您会迷失方向轻松的消息迁移以及protobuf提供的所有出色功能。

Cap'n Proto可以为固定大小的结构提供一个选项,但是它们通常也进行压缩,这将再次产生可变长度的消息。

如果您描述了最终要解决的问题,我们也许可以提出其他替代方案。

答案 1 :(得分:0)

您正在字节数组上调用len()。它将计算该数组中的元素数量,并返回它。

如果您刚刚实例化了一个新的,空的,protobuf指针对象,里面没有任何东西,则经过编组的字节数组将不保存任何数据,这就是为什么要获取0的原因。

我不确定您要它返回什么。您能否进一步说明您想要的输出内容是什么?我也许可以更好地回答你的问题。