代码之家  ›  专栏  ›  技术社区  ›  0xC0DEFACE

boost序列化与谷歌协议缓冲区?[关闭]

  •  69
  • 0xC0DEFACE  · 技术社区  · 17 年前

    有这些图书馆经验的人对他们更喜欢哪一个有什么评论吗?在使用过程中是否存在任何性能差异或困难?

    11 回复  |  直到 17 年前
        1
  •  45
  •   ndfred    16 年前

    我使用Boost序列化已经很长时间了,只是深入研究了协议缓冲区,我认为它们没有完全相同的目的。BS(没有看到这一点)将您的C++对象保存到流中,而PB是一种您可以读取/读取的交换格式。

    PB的数据模型要简单得多:你可以得到各种整数和浮点数、字符串、数组、基本结构,仅此而已。BS允许你在一个步骤中直接保存所有对象。

        2
  •  31
  •   Nikola Smiljanić    12 年前

        3
  •  27
  •   Community Mohan Dere    9 年前

    boost.serialization还有一些额外的问题,我将添加到其中。警告:除了浏览文档外,我对协议缓冲区没有任何直接经验。

    你的班级 序列化库 .

    may not generate archives that older versions can deserialize .

    • 我们的客户和;服务器软件创建了另一方使用的序列化对象,因此我们只能转向更新的boost.serialize,前提是我们同步升级客户端和服务器。(在你无法完全控制客户的环境中,这是一个相当大的挑战)。
    • 任何 部分boost,因为我无法升级boost.serialisation。我不确定尝试将多个版本的boost链接到一个可执行文件中是否可能/安全/理智,或者我们是否有预算/精力将需要保留在旧版本boost上的部分重构为单独的可执行文件(在我们的情况下是DLL)。

    publish the protocol buffers wire format forwards-compatible, backwards-compatible (尽管我认为维基百科指的是数据版本控制,而不是协议缓冲库版本控制)。虽然这两者都不能保证向前兼容性,但对我来说,这似乎是一个更强烈的迹象。

    总之, 我更喜欢一种众所周知的、公开的通讯格式

    脚注:无耻的插头 related answer 由我。

        4
  •  16
  •   Nick    15 年前

    • 支持STL容器。

    协议缓冲区

    • 可选地压缩数据。
    • 自动处理数据版本控制。
    • 不支持STL容器。

        5
  •  13
  •   Tom    17 年前

    助推)。

    • 协议缓冲区非常高效,所以我不
    • 协议缓冲区是灵活的,因为您可以添加“可选”字段。这基本上意味着您可以在不破坏兼容性的情况下更改协议缓冲区的结构。

        6
  •  11
  •   Maik Beckmann    17 年前

    serialize_obj >> archive;
    // ...
    unserialize_obj << archive;
    

    用于保存和加载。如果C++是你唯一使用的语言,你应该认真对待boost.serialisation。

        8
  •  6
  •   i_am_jorf    17 年前

    我从来没有使用boost的库实现过任何东西,但我发现Google protobuff的库更周到,代码也更清晰易读。我建议你看看你想用的各种语言,通读代码和文档,然后下定决心。

        9
  •  4
  •   bazza    8 年前

    不用说,如果你依靠网络流另一端的其他人以与自己相同的活力来做到这一点,这是不可能的,也是不可靠的。此外,如果有效性约束发生变化,则需要计划、协调和完成多个代码更改。

    ==编辑==

    message Foo
    {
        int32 bearing = 1;
    }
    

    bearing 是吗?我们可以

    message Foo
    {
        int32 bearing = 1;  // Valid between 0 and 359
    }
    

    message Foo
    {
        int32 bearing = 1;  // Valid between -180 and +180
    }
    

    Foo ::= SEQUENCE
    {
       bearing INTEGER (0..359)
    }
    

    Foo ::= SEQUENCE
    {
       bearing INTEGER (-180..180)
    }
    

    您还可以执行以下操作:

    bearingMin INTEGER ::= 0
    bearingMax INTEGER ::= 360
    
    Foo ::= SEQUENCE
    {
       bearing INTEGER (bearingMin..<bearingMax)
    }
    

    注意 <

    Garr ::= INTEGER (0..10 | 25..32)
    

    PDF

    Bar ::= SEQUENCE (SIZE(1..5)) OF Foo
    Sna ::= SEQUENCE (SIZE(5)) OF Foo
    Fee ::= SEQUENCE 
    {
        boo SEQUENCE (SIZE(1..<6)) OF INTEGER (-180<..<180)
    }
    

    ASN.1是老式的,但仍在积极开发、广泛使用(你的手机经常使用它),并且比大多数其他串行化技术灵活得多。我能看到的唯一不足之处是Python没有像样的代码生成器。如果你使用的是C/C++、C#、Java、ADA,那么免费(C/C++、ADA)和商业(C/C++、C#和Java)工具的组合将为你提供很好的服务。

    我特别喜欢二进制和基于文本的线格式的广泛选择。这使得它在某些项目中非常方便。线格式列表目前包括:

    • 0 15 只会占用 4 bits
    • 开放教育资源

    版本控制与GPB不同。您可以允许扩展:

    Foo ::= SEQUENCE
    {
       bearing INTEGER (-180..180),
       ...
    }
    

    Foo 轴承

    • 模式优先更好,但是
      • 其中许多在共享合同中留下了很大的空白(即没有约束)。GPB在这方面很烦人,因为它在其他方面都很好。
      • JSON验证器是可以的,但它们首先不会帮助您形成JSON,也不会自动调用。无法保证向您发送JSON消息的人已经通过验证器运行了它。你必须记得自己验证它。

    如果GPB添加了约束(注意:这不会改变任何导线格式),我会向每个人推荐几乎所有用途的约束。尽管ASN.1的uPER对于无线电链路非常有用。

        10
  •  3
  •   It'sPete    11 年前

    对我来说,这真的归结为工作流程,以及你是否需要在另一端使用C++以外的东西。

    如果你想先弄清楚你的消息内容,并且你正在从头开始构建一个系统,请使用Protocol Buffers。你可以以抽象的方式思考消息,然后以你想要的任何语言自动生成代码(第三方插件几乎适用于所有内容)。此外,我发现使用Protocol Buffers简化了协作。我只发送了一个.proto文件,然后另一个团队就清楚地知道要传输的数据是什么。我也不会对他们强加任何东西。如果他们想使用Java,那就去吧!

    如果我已经用C++构建了一个类(这种情况经常发生),并且我想现在通过网络发送这些数据,那么Boost序列化显然很有意义(尤其是在我已经在其他地方有Boost依赖关系的情况下)。

        11
  •  0
  •   Amanjit Gill    8 年前