我从通常使用的原型(prototype)类中创建了一个ProtocolBuffer对象,并且需要对其进行序列化。现在,我将对象取出,并像下面这样调用SerializeToArray():

int size = messageObject.ByteSize();
void* buffer = malloc(size);
messageObject.SerializeToArray(buffer, size);

据我所知,这没有问题,因为对象中有数据(我通过在Serialize行之前中断来检查它)。

但是,当该方法调用时,它会触发abort(),我对此一无所知。
我不知道那会是什么。此对象中唯一包含的数据是“类型”枚举器(我可以将其设置为此对象中使用的数据类型,因为它可以包含不同种类的消息),并且它包含一个可重复的消息对象类型。
message MessageID
{
    enum Type { LOGINDATA = 1; PLAYERDATA = 2; WORLDDATA = 3; }

    // Identifies which field is filled in.
    required Type type = 1;

    // One of the following will be filled in.
    repeated PlayerData playerData = 2;
    optional WorldData worldData = 3;
    optional LoginData loginData = 10;
}

这是基本消息。因此,在这种情况下,Type为2,代表PLAYERDATA。另外,将用单个类型为PlayerData的对象设置playerData。

感谢您的帮助。

最佳答案

每当protobuf库中止时(再次应该仅在 Debug模式下或在严重情况下),它将把有关问题的信息输出到控制台。如果您的应用没有控制台,则可以使用google::protobuf::SetLogHandler将信息定向到其他位置:

https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.common#SetLogHandler.details



我知道中止的唯一原因(仅适用于调试版本)是未设置某些必填字段。您说的是type字段已设置,因此PlayerData中必须有一个未设置的必填字段。

关于c++ - ProtocolBuffer,SerializeToArray()上的abort(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24894617/

10-11 21:54