【问题标题】:Binary serialization/de-serialization in C++ and C#C++ 和 C# 中的二进制序列化/反序列化
【发布时间】:2011-06-08 08:08:40
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

  • 我最好的建议是不要这样做。使用 json、xml 或其他方式传输数据。首先实施,如果它最终太慢,那么分析什么需要时间......
  • 我从 XML 序列化开始,与二进制序列化(两端都运行 c++ 应用程序)相比,它确实证明更慢。这就是我首先选择 Boost.Serialization 的原因。
  • 你有没有考虑过开发一个简单的COM应用程序,据我所知C++和.NET都支持COM技术。
  • 查看我关于不同格式和性能的博文 - maxondev.com/…

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的建议。我会调查一下。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 1970-01-01
      • 2015-02-12
      • 2020-03-07
      • 2012-06-15
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      相关资源
      最近更新 更多