(ProtoBuf)无法解析类型" data.Data"的消息。因为它缺少必填字段:ID

时间:2014-04-29 19:25:06

标签: c++ protocol-buffers winsock

我正在尝试通过winsock发送一个protocolbuffer文件,但我遇到了以下问题。 当我发送数据时,它可能是原型数据包“A”或“B”的序列化版本,但服务器不知道。所有proto数据包都有一个ID字段作为第一个字段,因此我创建了一个只有ID作为字段的数据包“C”。

当服务器收到数据包时,它首先将其反序列化为“C”proto对象,只是为了检查它具有的ID。之后,当服务器知道ID时,可以再将其反序列化为正确的proto对象。

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

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

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

感谢任何帮助。我希望问题很清楚。

1 个答案:

答案 0 :(得分:1)

一般来说,"标准"在protobuf中区分不同传入消息类型的方法是定义一个包含这些不同消息的联合类型,以及一个确定它们中存在哪些消息的字段。请参阅此here上的官方文档 案例:

message A
{
    // ...
}

message B
{
    // ...
}

message C
{
    enum Type { A = 1; B = 2; }

    required Type type = 1;   
    optional A a = 2;
    optional B b = 3;
}