gpt4 book ai didi

serialization - 高性能实体序列化: BSON vs MessagePack (vs JSON)

转载 作者:行者123 更新时间:2023-12-03 04:29:23 62 4
gpt4 key购买 nike

最近我发现 MessagePack ,Google Protocol Buffers 的替代二进制序列化格式和 JSON这也优于两者。

还有 BSON MongoDB 用于存储数据的序列化格式。

有人可以详细说明 BSON 与 MessagePack 的差异和缺点/优点吗?

<小时/>

只是为了完成高性能二进制序列化格式的列表:还有 Gobs 它将成为 Google Protocol Buffers 的继承者 。然而 与所有其他提到的格式相比,这些格式与语言无关并且依赖 Go's built-in reflection 至少还有除 Go 之外的其他语言的 Gobs 库。

最佳答案

//请注意,我是 MessagePack 的作者。这个答案可能有偏见。

格式设计

  1. 与 JSON 的兼容性

    尽管名字如此,但与 MessagePack 相比,BSON 对 JSON 的兼容性并不好。

    BSON 有特殊类型,如“ObjectId”、“Min key”、“UUID”或“MD5”(我认为 MongoDB 需要这些类型)。这些类型与 JSON 不兼容。这意味着当您将对象从 BSON 转换为 JSON 时,某些类型信息可能会丢失,但当然只有当这些特殊类型位于 BSON 源中时才会丢失。在单个服务中同时使用 JSON 和 BSON 可能是一个缺点。

    MessagePack 旨在透明地与 JSON 相互转换。

  2. MessagePack 比 BSON 小

    MessagePack 的格式比 BSON 更简洁。因此,MessagePack 可以序列化小于 BSON 的对象。

    例如,一个简单的映射 {"a":1, "b":2} 使用 MessagePack 序列化为 7 个字节,而 BSON 使用 19 个字节。

  3. BSON支持就地更新

    使用 BSON,您可以修改部分存储的对象,而无需重新序列化整个对象。假设映射 {"a":1, "b":2} 存储在文件中,并且您想要将 "a"的值从 1 更新到 2000。

    对于 MessagePack,1 仅使用 1 个字节,但 2000 使用 3 个字节。所以“b”必须向后移动2个字节,而“b”不被修改。

    对于 BSON,1 和 2000 都使用 5 个字节。由于如此冗长,您不必移动“b”。

  4. MessagePack 有 RPC

    MessagePack、Protocol Buffers、Thrift 和 Avro 支持 RPC。但 BSON 没有。

这些差异意味着 MessagePack 最初是为网络通信而设计的,而 BSON 是为存储而设计的。

实现和API设计

  1. MessagePack 具有类型检查 API(Java、C++ 和 D)

    MessagePack 支持静态类型。

    与 JSON 或 BSON 一起使用的动态类型对于 Ruby、Python 或 JavaScript 等动态语言非常有用。但对于静态语言来说就麻烦了。您必须编写无聊的类型检查代码。

    MessagePack 提供类型检查 API。它将动态类型对象转换为静态类型对象。这是一个简单的示例(C++):

    #include <msgpack.hpp>

class myclass {
private:
std::string str;
std::vector<int> vec;
public:
// This macro enables this class to be serialized/deserialized
MSGPACK_DEFINE(str, vec);
};

int main(void) {
// serialize
myclass m1 = ...;

msgpack::sbuffer buffer;
msgpack::pack(&buffer, m1);

// deserialize
msgpack::unpacked result;
msgpack::unpack(&result, buffer.data(), buffer.size());

// you get dynamically-typed object
msgpack::object obj = result.get();

// convert it to statically-typed object
myclass m2 = obj.as<myclass>();
}
  • MessagePack 具有 IDL

    与类型检查API有关,MessagePack支持IDL。 (规范可从: http://wiki.msgpack.org/display/MSGPACK/Design+of+IDL )

    Protocol Buffers 和 Thrift 需要 IDL(不支持动态类型)并提供更成熟的 IDL 实现。

  • MessagePack 具有流 API(Ruby、Python、Java、C++...)

    MessagePack 支持流式反序列化器。此功能对于网络通信很有用。这是一个示例(Ruby):

  •     require 'msgpack'

    # write objects to stdout
    $stdout.write [1,2,3].to_msgpack
    $stdout.write [1,2,3].to_msgpack

    # read objects from stdin using streaming deserializer
    unpacker = MessagePack::Unpacker.new($stdin)
    # use iterator
    unpacker.each {|obj|
    p obj
    }

    关于serialization - 高性能实体序列化: BSON vs MessagePack (vs JSON),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6355497/

    62 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com