golang protobuf封送固定大小的空结构

golang protobuf封送固定大小的空结构,go,proto,Go,Proto,我有一个protobuf结构Data 在.proto中: message Data { uint64 ID = 1; uint32 GUID = 2; } 在戈兰 b, err := proto.Marshal(&pb.Data{}) if err != nil { panic(err) } fmt.Println(len(b)) 我得到了0长度 如何使proto.Marshal始终返回固定大小,而不管pb.Data是什么 附言 pb.数据仅包含在字节数组上调

我有一个protobuf结构
Data

.proto
中:

message Data {
    uint64 ID = 1;
    uint32 GUID = 2;
}
在戈兰

b, err := proto.Marshal(&pb.Data{})
if err != nil {
    panic(err)
}
fmt.Println(len(b))
我得到了
0
长度

如何使proto.Marshal始终返回固定大小,而不管pb.Data是什么

附言

pb.数据仅包含在字节数组上调用的
len()
int32
。它将计算该数组中的元素数,并返回它

如果您刚刚实例化了一个新的、空的protobuf指针对象,其中没有任何内容,那么封送的字节数组将不会保存任何数据——因此您将获得
0


我很不确定你想要它归还什么。你能用你想要的输出来进一步澄清你的问题吗?我也许能更好地回答你的问题。

这里有两个问题

1) protobuf对整数使用可变编码,因此大小取决于值,请参阅

2) 默认情况下不会传输零值字段,因此,由于两个整数为零,因此即使它们的字段标识符也不会发送。我甚至不确定是否有发送零值的选项

若将它们都设置为1,则字节数将超过零,但根据值的范围,其长度仍然不会固定

所以,一般来说,在protobuf消息中没有真正的方法来强制执行固定大小

如果您想要固定长度的消息,您可能最好在有线类型编码上使用直接结构,但这对于语言互操作来说就更难了,因为它们都必须定义相同的消息,您将失去简单的消息迁移和protobuf提供的所有酷东西

可能有固定大小结构的选项,但它们通常也会压缩,这将再次产生可变长度的消息

如果您描述了您试图最终解决的问题,我们可能会建议其他替代方案