我从通常使用的原型(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/