5

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

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

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

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

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

另外,我想知道如果我使用像gzip这样的标准,那会有效吗?gzip还有其他替代品吗?它们的优点/缺点是什么?

谢谢

4

3 回答 3

5

我会推荐 Protocol Buffers,它是 Google 自己的序列化库。它同时具有 .Net、C++ 和 Java 序列化程序。大多数实现也相当快。

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

于 2011-01-13T07:22:49.590 回答
4

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

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

于 2011-01-13T07:26:43.913 回答
3

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

如果您只想要简单的对象序列化,我会看看 json.org 周围有很多 C++ / .NET 实现。

于 2011-01-13T09:51:07.053 回答