C++和C#中的二进制序列化/反序列化

6pa*_*kid 5 c# c++ ipc marshalling boost-serialization

我正在开发一个分布式应用程序,它有两个组件.一个用标准C++编写(不是托管C++,在Linux平台上运行),另一个用C#编写.两者都通过消息总线进行通信.

我有一种情况需要将对象从C++传递到C#应用程序,为此我需要在C++中序列化这些对象并在C#中对它们进行反序列化(类似于.NET中的编组/解组).我需要以二进制而不是XML(由于性能原因)执行此序列化.

我曾经习惯Boost.Serialization这样做,当两端都是用C++实现的,但现在我的一端有一个.NET应用程序,Boost.Serialization这不是一个可行的解决方案.

我正在寻找一种解决方案,允许我跨C++和.NET边界执行(反)序列化,即跨平台二进制序列化.

我知道我可以在C++ DLL中实现(de)序列化代码并P/Invoke在.NET应用程序中使用,但我想保留它作为最后的手段.

另外,我想知道我是否使用像gzip这样的标准,这会有效吗?除了gzip还有其他选择吗?它们的优点/缺点是什么?

谢谢

jga*_*fin 5

我建议使用Protocol Buffers,这是Googles自己的序列化库.它有.Net,C++和Java序列化器.大多数实现也非常快.

http://code.google.com/p/protobuf/


Mar*_*ell 4

gzip 不会直接帮助序列化 - 它只会(尝试)缩小流。这可能有帮助,也可能没有帮助,具体取决于流中重复数据的数量。对于文本较少的密集数据,我发现 gzip增加了有效负载的大小。

就我个人而言,我会在这里查看协议缓冲区(但我有偏见,因为我是许多扩展的作者之一)。您通常(但并非总是)使用基本语言(.proto 文件)定义消息,并运行特定于语言的工具来生成类。性能非常好——专注于.NET它可以远远超过内置的序列化器( 1 2 3 )