C++中的Google协议缓冲区:从现有结构中创建消息
Google Protocol Buffers in C++: Creating a message from an existing struct
我正在考虑使用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格式非常简单,几乎很可笑。编写一个序列化框架,让你可以做一些有趣的事情,比如生成原型,这是最困难的部分。
- 如何在C++类内存结构中创建"spacer"?
- 创建结构的数组时遇到分段错误
- 如何在 c++ 中创建结构向量的映射
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- CLang:在 std::thread 中运行函数会导致结构创建BAD_ACCESS
- C++为API中定义的结构创建超类
- C++ 使用数组结构创建平衡的二叉搜索树
- 使用匿名联合为结构创建空构造函数
- 正确的结构创建
- OPENDDS-从单个IDL结构创建多个主题
- 是否可以使用给定参数为结构创建推力的功能谓词?
- MFC文档/视图体系结构-创建没有初始视图的文档
- 在c++结构创建中更快地执行
- JNA -结构创建错误
- C++中模板结构创建之间的差异
- 无法推送到由静态映射<结构创建的队列,队列>
- 为类/结构创建多个对象
- 如何从模板结构创建二维数组
- 指向从另一个结构创建的数组的指针(不确定措辞是否正确)C++
- 使用结构创建数组