我从通常使用的原型类中创建了一个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库中止时(再次应该仅在调试模式下或在严重情况下),它将把有关问题的信息输出到控制台。如果您的应用程序没有控制台,则可以用于google::protobuf::SetLogHandler
将信息定向到其他位置:
typedef void LogHandler(LogLevel level, const char* filename, int line, const std::string& message); LogHandler* SetLogHandler(LogHandler* new_func);
protobuf库有时会将警告和错误消息写入stderr。
这些消息主要对开发人员有用,但也可以帮助最终用户解决问题。如果您希望将这些消息发送到stderr以外的其他地方,请调用SetLogHandler()来设置您自己的处理程序。这将返回旧的处理程序。将处理程序设置为NULL可忽略日志消息(但另请参见下面的LogSilencer)。
显然,SetLogHandler不是线程安全的。您应该只在初始化时调用它,而可能不能从库代码中调用它。如果您只是想暂时抑制日志消息(例如,由于您的某些代码往往会频繁触发它们,并且您知道警告对您而言并不重要),请使用下面的LogSilencer类。
我知道中止的唯一原因(仅适用于调试版本)是未设置某些必填字段。您说该type
字段已设置,因此必须有一个PlayerData
未设置的必填字段。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句