C++中的Google协议缓冲区:从现有结构中创建消息

Google Protocol Buffers in C++: Creating a message from an existing struct

本文关键字:结构 创建 消息 Google 中的 协议 缓冲区 C++      更新时间:2023-10-16

我正在考虑使用Google协议缓冲区来解决C++和C#之间使用命名管道进行通信的问题。但我有一个问题:我在protobuf上所能找到的就是如何使用protobuf编译器从原型创建消息。这很好,但我还需要能够序列化现有的结构。我似乎找不到任何信息(但也许我忽略了它)。你知道是否可以使用protobufs在C++中序列化一个结构,这样它就可以在.NET中读取,而无需修改现有的结构吗?

是和否

这是可能的。事实上,我已经完成了。不是.NET加载部分,而是对protobuf的序列化,以及从C++类生成原型。然而,要做到这一点需要做很多事情,而且并不是那么容易。

首先,原蟾蜍表示数据的能力非常有限。它们基本上只能表示POD类型(在C++意义上),其他几乎没有。我个人不得不为该格式添加一些基本内容,使其成为一个适当的全功能序列化格式。但是,如果您将自己限制为POD类型,那么纯protobuf格式将可以正常工作。

第二件事是,您将需要某种序列化库,这将需要为每个结构/类添加一些代码来执行序列化/反序列化(不一定是"侵入性的",这意味着您可能不必更改类,只需在侧面添加一些代码)。您可以查看Boost.Serialization,它是如何在C++中创建序列化库的基本模板。Boost.Serialization并不是特别灵活,因此,您可能需要更改一些内容(就像我必须做的那样)。

第三件事是,你需要相当多的魔法才能实现这一点。特别是,您将需要一个可靠且功能丰富的运行时类型识别系统(RTTI),以便能够拥有有用的类型名称,并且您可能需要巧妙的元编程或一些侵入式类层次结构,以便能够检测需要为其生成原型的用户定义类型。

所以,这就是为什么我的答案是"是和否",因为这是可能的,但不是没有大量的工作和一个好的框架可以依赖

注意:编写代码将数据编码/解码为proto-buf格式(包括那些小int等等)真的很容易,proto-buff格式非常简单,几乎很可笑。编写一个序列化框架,让你可以做一些有趣的事情,比如生成原型,这是最困难的部分。