- 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/
我试图理解 BSON 符号 来自网站 BSON Site .但是,我无法理解相关性背后的原因。 我也提到了以下问题,但由于以下原因,我不相信。 Question 1 : 不熟悉 ruby 实现 Que
我收到以下错误: { [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' } js-bson:
假设我们有一个字符串,里面有二进制 bson 数据。如何加载到 bson object ? 最佳答案 我想在同一个页面上有一个例子可以做到这一点: BSONObjBuilder b; b << "na
我正在寻找如下所示的 type_of 方法: import bson bson.type_of(42) # it should return "int". bson.type_of("hello")
Base64 编码的 BSON 比 BSON 小吗? 最佳答案 Piskvor 的权利,base64 编码的任何东西都比原始长。您对某些内容进行 base64 编码以使其进入具有有限字符轨道的 cha
目前正在做一个 Golang 项目,但我得到了一些 Controller package controller import ( "go.mongodb.org/mongo-driver
这个特定的问题与使用 mongodb 和 golang 包 mongo-driver 相关。 ,但我认为这适用于与 mongodb 的大多数接口(interface)。 使用 Find 时要从集合中查
目前正在做一个 Golang 项目,但我得到了一些 Controller package controller import ( "go.mongodb.org/mongo-driver
可能相关:How to use interface type as a model in mgo (Go)? 我有一个像这样的结构: type Game struct { ID b
有没有一种方法可以使用 MongoDB C++ 驱动程序中的 BSON() 宏来生成 BSON 将空值。例如,为了生成一个 BSON 来表示这个文档:{"a": "foo", "b": null}:
我通过以下两种不同的方法生成了一个 ObjectId: user@ubuntu:~$ python Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24)
我如何转换 BsonDocument到 FilterDefinition实例? 它是新的 MongoDb C# 驱动程序提供的类。 最佳答案 BsonDocument 和 FilterDefiniti
我正在尝试从 Json 生成 Bson。我尝试使用 Json.Net,但似乎有记录的行为,其中库为整数字段生成 uint64。不幸的是,我们必须使用 uint32。 因此我正在尝试使用 mongodb
我正在使用 https://github.com/mongodb/mongo-go-driver和目前正在尝试实现此类结构的部分更新 type NoteUpdate struct { ID
我目前正在尝试读取 bson 文件以将其导入数据库。我已经可以读取该文件并将其作为字节打印,但最终只收到 bson.errors.InvalidBSON: objsize Too Large 错误。
我尝试在 arch linux 迷你计算机(cubox)上安装 mean.io 堆栈。所以我安装了 nodejs 和 mongodb 包。 我用 Git 检索了堆栈,进行了 npm 安装(没问题)但是
为什么会输出false?我期待 true... package main import ( "fmt" "time" "gopkg.in/mgo.v2/bson" )
这是一种愚蠢的语法错误,尝试了很多方法,但都无法正常工作,请大家帮忙。 使用 mgo 在 Go 中使用 MongoDB,我只是尝试简化 $ne 运算符的使用,代码如下所示,但不断出现编译语法错误: l
我设置了新的 Typescript/React 项目,在 tsconfig.json 文件中收到此错误消息 "找不到 'bson' 的类型定义文件。该文件在程序中,因为:隐式类型库 'bson' 的入
我尝试将数据从 SQL Server 迁移到 MongoDB,但在将数据导入到 MongoDB 的最后阶段遇到了以下类型错误。 mongoImp = dbo.insert_many(jArray)
我是一名优秀的程序员,十分优秀!