我正在考虑使用Google protocol buffers来解决我使用命名管道在C ++和C#之间进行通信的问题。但我有一个问题:我在protobuf上找到的是如何使用protobuf编译器从原型创建消息。这很整洁,但我还需要能够序列化现有结构。我似乎无法找到任何信息(但也许我忽略了它)。您是否知道是否可以使用protobufs在C ++中序列化结构,因此可以在.NET中读取它,而无需修改现有的结构?
答案 0 :(得分:6)
是和否。
这是可能的。事实上,我已经做到了。不是.NET加载部分,而是对protobuf的序列化以及从C ++类生成原型。但是,这样做需要很多东西,并不容易。
首先,protobuf在表示数据方面的能力非常有限。它们基本上只能表示POD类型(在C ++意义上),而且很少。我个人不得不在格式中添加一些基本内容,使其成为一个适当的全功能序列化格式。但是如果你将自己局限于POD类型,那么普通的protobuf格式就可以了。
第二件事是您需要某种类型的序列化库,这将要求您为每个结构/类添加一些代码以执行序列化/反序列化(不一定是“侵入式”,意味着您可能不必更改类,只需添加一些代码)。您可以查看Boost.Serialization,这是如何在C ++中创建序列化库的基本模板。 Boost.Serialization对于此目的并不是特别灵活,因此,您可能需要更改一些内容(就像我必须做的那样)。
第三件事是,你需要相当多的巫术来实现这一目标。特别是,您需要一个可靠且功能丰富的运行时类型识别系统(RTTI)才能拥有有用的类型名称,并且您可能需要巧妙的元编程或某些侵入式类层次结构才能够检测需要生成原型的用户定义类型。
所以,这就是为什么我的答案是“是和不”,因为它是可能的,但并非没有相当多的工作和良好的框架可供依赖。
N.B。:编写代码将数据编码/解码为proto-buf格式(带有那些小内容,以及所有这些)真的很容易,proto-buf格式非常简单,几乎可笑。编写序列化框架,这将允许你做一些奇特的事情,如生成原型,这是困难的部分。