22

我正在构建一个分布式 C++ 应用程序,该应用程序需要对在不同进程和计算机之间传递的简单数据结构进行大量序列化和反序列化。

我对序列化复杂的类层次结构不感兴趣,但更多的是发送带有一些简单成员(如数字、字符串和数据向量)的结构。数据向量通常可以是许多兆字节。我担心基于 text/xml 的方法太慢了,我真的不想自己写这个,因为字符串编码和数字字节序等问题会使它比表面上看起来更复杂。

我一直在研究协议缓冲区和 boost.serialize。根据文档,协议缓冲区似乎非常关心性能。从某种意义上说,Boost 似乎更轻量级,因为您没有用于指定数据格式的外部语言,我觉得这对于这个特定项目非常方便。

所以我的问题归结为:有人知道对于我上面描述的典型用例,boost 序列化是否很快?

此外,如果还有其他可能适合此的库,我很乐意听到它们。

4

8 回答 8

14

我强烈建议使用协议缓冲区。它们使用起来非常简单,提供出色的性能,并解决了字节顺序和向后兼容性等问题。为了使其更具吸引力,由于多种语言实现,序列化数据与语言无关。

于 2008-11-27T06:06:28.003 回答
4

我会想到 ACE 和 ACE TAO,但您可能不喜欢它的大小和范围。 http://www.cs.wustl.edu/~schmidt/ACE.html

关于您对“快速”和提升的查询。这是一个主观术语,在不了解您的要求(吞吐量等)的情况下,很难为您回答这个问题。并不是说我自己对提升的东西有任何基准......

您可以使用一些消息传递层,但它们可能比 boost 慢。我想说您在 boost 中找到了一个很好的解决方案,但我只使用了 ACE 和其他专有的通信/消息传递产品。

于 2008-11-26T18:13:13.667 回答
3

我的猜测是 boost 已经足够快了。我在以前的项目中使用它来将数据序列化到磁盘和从磁盘序列化,它的性能甚至从未成为问题。

我在这里的回答一般都是关于序列化的,除了你选择使用的序列化库之外,这可能对你有所帮助。

话虽如此,看起来您知道序列化(字节序字符串编码)的大部分主要问题点。您确实忽略了版本控制和向前/向后兼容性。如果时间不重要,我建议您编写自己的序列化代码。这是一次启发性的经历,你学到的教训是无价的。虽然我会警告你,但它会让你讨厌基于 XML 的协议的臃肿。:)

无论您选择哪种方式,都祝您项目顺利。

于 2008-11-26T18:46:56.143 回答
3

另请查看ONC-RPC(旧 SUN-RPC)

于 2008-11-28T14:43:38.553 回答
2

boost.serialization 不关心字符串编码或字节序。如果这对您很重要,那么您同样可以不使用它。

您可能想从 ZeroC 研究 ICE:http ://www.zeroc.com/

它的工作方式与 CORBA 类似,只是它完全由公司指定和定义。好处是实现按预期工作,因为没有那么多。不利的一面是,如果您使用的是他们不支持的语言,那么您就不走运了。

于 2008-11-26T18:29:28.940 回答
2

如果您只发送定义明确的数据结构,那么也许您应该将ASN.1视为一种编码方法?

于 2008-11-26T19:31:50.607 回答
1

还有Thrift,它看起来像一个 alpha 项目,但由 Facebook 使用和开发,因此它的用户很少。

或者好的旧DCE,这是 MS 决定用于 COM 的标准。它现在是开源的,虽然晚了 20 年,但总比没有好。

于 2009-03-15T18:40:37.923 回答
0

不要抢先优化。首先测量,然后优化。

于 2008-11-26T18:32:13.880 回答