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

5
我正在开发一个分布式应用程序,有两个组成部分。其中一个是用标准C++编写的(不是托管C++,并且在Linux平台上运行),另一个是用C#编写的。两者通过消息总线进行通信。
我遇到了一个情况,需要将对象从C++传递到C#应用程序,为此我需要在C++中对这些对象进行序列化,并在C#中进行反序列化(类似于.NET中的封送/取消封送)。我需要以二进制而不是XML格式执行此序列化(由于性能原因)。
当两端都使用C++实现时,我已经使用了 Boost.Serialization来完成此操作,但是现在我有一个.NET应用程序,所以Boost.Serialization不是可行的解决方案。
我正在寻找一种跨C++和.NET边界执行(反)序列化的解决方案,即跨平台二进制序列化。
我知道可以在C++ dll中实现(反)序列化代码,并在.NET应用程序中使用P/Invoke,但我想把它作为最后的选择。
此外,我想知道是否使用gzip之类的标准方法会有效?还有其他替代方案吗?它们的优缺点是什么?
谢谢。

我最好的建议是不要这样做。使用json、xml或其他东西来传输数据。首先实现它,如果速度太慢,然后分析哪些部分需要优化... - Cine
1
我最初使用XML序列化,但与二进制序列化相比速度较慢(两端都运行C++应用程序)。这就是我选择Boost.Serialization的原因。 - Aaron S
你是否考虑过开发一个简单的COM应用程序,据我所知,C++和.NET都支持COM技术。 - baris.aydinoz
请查看我的博客文章,了解有关不同格式和性能的信息 - http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/ - Maxim
3个回答

5
我建议使用Protocol Buffers,这是谷歌自己的序列化库。它具有 .Net、C++ 和 Java 序列化器。大多数实现也非常快速。 http://code.google.com/p/protobuf/

谢谢您的建议。我会研究一下。 - Aaron S

4

gzip并不能直接帮助序列化,它只会(尝试)缩小流。这可能有所帮助,也可能没有,这取决于流中重复数据的数量。对于密集数据而言,gzip可能会增加有效载荷的大小。

个人建议在这里使用协议缓冲区(但我有偏见,因为我是许多扩展作者之一)。通常情况下(但并非总是如此),您需要用基本语言(.proto文件)定义消息,并运行特定于语言的工具来生成类。性能非常好 - 在.NET上,它可以远远超过内置的序列化程序(1 2 3)。


3

另一种可能性是Thrift,它拥有更多的后端,并且在必要时提供了网络通信所需的大部分代码——如果您想进行扩展。

如果您只需要简单的对象序列化,可以看看json.org。有许多C++/.NET实现可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接