(普罗托布夫)无法解析类型 "data.Data" 的消息,因为它缺少必填字段:ID

(ProtoBuf) Can't parse message of type "data.Data" because it is missing required fields: ID

本文关键字:因为 消息 ID 字段 Data 罗托布 data 类型      更新时间:2023-10-16

我正试图通过winsock发送一个protocolbuffer文件,但在atm上遇到了以下问题。当我发送数据时,它可能是proto数据包"a"或"B"的序列化版本,但服务器不知道这一点。所有的proto数据包都有一个ID字段作为第一个字段,所以我制作了一个只有ID字段的数据包"C"。

当服务器接收到一个数据包时,它首先将其反序列化为一个"C"原型对象,只是为了检查它的ID。之后,当服务器知道ID时,可以再次将其反序列化为正确的proto对象。

因此,目前,我这样做,但当数据包到达时(它也是一个"C"对象来测试它(,它被反序列化为一个"C"对象,并返回此错误:

[librotobuf] Can't parse message of type "C" because it is missing reauired fields: ID

这看起来很奇怪,因为我在发送时已经填写好了。这和字节序有关吗?我有点迷上了这个。

感谢您的帮助。我希望问题是清楚的。

通常,在protobuf中区分不同传入消息类型的"标准"方法是定义一个包含这些不同消息的并集类型,以及一个字段来确定存在哪些消息。请参阅此处的官方文档
案例示例:

message A
{
    // ...
}
message B
{
    // ...
}
message C
{
    enum Type { A = 1; B = 2; }
    required Type type = 1;   
    optional A a = 2;
    optional B b = 3;
}