google protobuf 消息反射

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,他们用于 RPC 系统和持续数据存储系统。

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式,并且提供了 多种语言语言的 API,比如C++、Java、Python等

使用C++的情况下,一般使用下面的方法来实现消息的反射:

google::protobuf::Message* CreateMessage(const std::string& typeName)
{
google::protobuf::Message* message = NULL;
const google::protobuf::Descriptor* descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(typeName);
if (descriptor)
{
const google::protobuf::Message* prototype = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
if (prototype)
{
message = prototype->New();
}
}
return message;
}

我在项目中也是这样去实现网络消息的自动派发,ProtoBuf版本是2.6.1。

但是前不久,我突然发现某些Message却无法动态创建出来。
经我测试发现,创建不出来的Message集中在某些特定的*.proto文件中,并且我每次开服,创建不出来的Message还不一样,经我反复实验,发现proto定义时枚举出现了冲突现象,如下:

同一命名空间下的两个枚举
enum AAA
{
aaa = 0;
}

enum BBB
{
aaa = 0;
}

这样的定义不允许的 ,如果这样的两个定义放在同一个*.proto文件中 Protoc生成代码时会提示
但是当 AAA和BBB不在同一个*.proto文件中时,Protoc是不检测冲突的 这点要格外注意
如果出现重名现象,会导致某些协议没有注册 Descriptor 进而无法动态生成message对象

你可能感兴趣的:(google protobuf 消息反射)