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

时间:2011-01-13 07:16:32

标签: c# c++ ipc marshalling boost-serialization

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

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

当两端都是用C ++实现时,我使用Boost.Serialization来实现这一点,但现在我的一端有一个.NET应用程序,Boost.Serialization不是一个可行的解决方案。

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

我知道我可以在C ++ dll中实现(de)序列化代码并在.NET应用程序中使用P/Invoke,但我希望将其作为最后的手段。

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

由于

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

gzip不会直接帮助进行序列化 - 它只会(尝试)缩小流。此可能可以提供帮助,具体取决于流中重复数据的数量。对于文本很少的密集数据,我看到gzip 增加有效载荷的大小。

我个人会在这里看protocol buffers(但我有偏见,因为我是many extensions的作者之一)。您通常(但不总是)使用基本语言(.proto文件)定义消息,并运行特定于语言的工具来生成类。性能非常好 - 专注于.NET它可以超过内置的序列化器(1 2 3

答案 2 :(得分:3)

另一种可能性是Thrift,它有更多的后端,如果需要,它提供了网络通信所需的大部分代码 - 如果你想扩展的话。

如果你只想要简单的对象序列化,我会看一下json.org。有大量的C ++ / .NET实现。