- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我发现 MessagePack ,Google Protocol Buffers 的替代二进制序列化格式和 JSON这也优于两者。
还有 BSON MongoDB 用于存储数据的序列化格式。
有人可以详细说明 BSON 与 MessagePack 的差异和缺点/优点吗?
<小时/>只是为了完成高性能二进制序列化格式的列表:还有 Gobs
它将成为 Google Protocol Buffers 的继承者
。然而
与所有其他提到的格式相比,这些格式与语言无关并且依赖
Go's built-in reflection
至少还有除 Go 之外的其他语言的 Gobs 库。
最佳答案
//请注意,我是 MessagePack 的作者。这个答案可能有偏见。
格式设计
与 JSON 的兼容性
尽管名字如此,但与 MessagePack 相比,BSON 对 JSON 的兼容性并不好。
BSON 有特殊类型,如“ObjectId”、“Min key”、“UUID”或“MD5”(我认为 MongoDB 需要这些类型)。这些类型与 JSON 不兼容。这意味着当您将对象从 BSON 转换为 JSON 时,某些类型信息可能会丢失,但当然只有当这些特殊类型位于 BSON 源中时才会丢失。在单个服务中同时使用 JSON 和 BSON 可能是一个缺点。
MessagePack 旨在透明地与 JSON 相互转换。
MessagePack 比 BSON 小
MessagePack 的格式比 BSON 更简洁。因此,MessagePack 可以序列化小于 BSON 的对象。
例如,一个简单的映射 {"a":1, "b":2} 使用 MessagePack 序列化为 7 个字节,而 BSON 使用 19 个字节。
BSON支持就地更新
使用 BSON,您可以修改部分存储的对象,而无需重新序列化整个对象。假设映射 {"a":1, "b":2} 存储在文件中,并且您想要将 "a"的值从 1 更新到 2000。
对于 MessagePack,1 仅使用 1 个字节,但 2000 使用 3 个字节。所以“b”必须向后移动2个字节,而“b”不被修改。
对于 BSON,1 和 2000 都使用 5 个字节。由于如此冗长,您不必移动“b”。
MessagePack 有 RPC
MessagePack、Protocol Buffers、Thrift 和 Avro 支持 RPC。但 BSON 没有。
这些差异意味着 MessagePack 最初是为网络通信而设计的,而 BSON 是为存储而设计的。
实现和API设计
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/
我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这
当我尝试打印 BST 的级别顺序时,这个问题提示了我。 这是一个 Pre-Order Sequence: 4, 1, 2, 3, 5, 6, 7, 8 In_order Sequence : 1, 2
我的代码在 main(序列测试;)的第一行出现错误,指出它是对 sequence::sequence() 的 undefined reference 。我无法更改 main 中的代码。有谁知道我该如何
这可能很简单,但我在通常的 latex 指南中找不到任何相关内容。在这句话中: {\em hello\/} “\/”的目的是什么? 最佳答案 这就是所谓的斜体校正。其目的是确保斜体文本后有适当的间距。
当我从 Postgresql 表中删除所有记录,然后尝试重置序列以在插入时开始一个编号为 1 的新记录时,我得到不同的结果: SELECT setval('tblname_id_seq', (SELE
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。 它不允许在多个查询中
如何在 Groovy 中获取给定数字的序列,例如: def number = 169 // need a method in groovy to find the consecutive number
基本上,如果这是 .NET,它看起来像这样: ISomething { string A { get; } int B { get; } } var somethings = new List
说以下代码部分(同一块): A <= 1 A <= 2 变量 A 总是被赋值为 2 吗?还是会出现竞争条件并分配 1 或 2? 我对非阻塞赋值的理解是,由硬件在 future 分配变量 A,因此它可能
在运行 WiX 设置时,我正在寻找操作列表及其顺序。不知何故,官方网站似乎没有提供任何信息。 基本问题是我想正确安排我的自定义操作。通常我需要使用 regsvr32.exe 注册一个 DLL,而这只能
F#初学者在这里 我想创建一个类型,它是具有至少一个元素的另一种具体类型(事件)的序列。任何其他元素都可以在以后随时添加。通常在 C# 中,我会创建一个具有私有(private) List 和公共(p
作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。 我的脚本创建了一个过程来删除表/序列,执行该过程,然
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
这个问题已经有答案了: sql ORDER BY multiple values in specific order? (12 个回答) 已关闭 9 年前。 我有一个 sql 语句,我想要ORDER
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
在用java编写代码时,我需要用“],[”分割字符串。下面是我的代码。 try (BufferedReader reader = new BufferedReader(new InputStreamR
这个问题已经有答案了: Project Euler Question 14 (Collatz Problem) (8 个回答) 已关闭 9 年前。 我正在尝试查找数字的 Collatz 序列。以下
我有一个例程函数process_letter_location(const char& c, string &word)。 在我的 main 中,我声明了一系列字符串变量,如下所示: string s
我需要找到最长的多米诺骨牌链,给定一组 12 个随机挑选的多米诺骨牌。我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性)。多米诺骨牌由一 block “砖 blo
我有这个数据结构 Seq,它继承了类 vector 但有一些额外的功能。使用这个数据结构 Seq 我有这个预定义的数据结构: typedef Seq > MxInt2d; 我现在想要一个包含多个 Mx
我是一名优秀的程序员,十分优秀!