最近我发现了MessagePack,这是Google的Protocol Buffers和JSON的替代二进制序列化格式,它也优于两者.
还有MongoDB用于存储数据的BSON序列化格式.
有人可以详细说明BSON与MessagePack的差异和优势吗?
只是为了完成高效的 二进制序列化格式列表:还有Gobs将成为Google协议缓冲区的继承者.然而,与所有其他提到的格式相比,这些格式不是语言无关的,并且依赖于Go的内置反射,至少还有除Go之外的其他语言的Gobs库.
有人试图使用MessagePackAndroid应用吗?
可能吗?我试图使用Jar msgpack-java并收到以下异常:
Caused by: java.lang.ExceptionInInitializerError
at org.msgpack.Packer.pack(Packer.java:532)
at org.msgpack.MessagePack.pack(MessagePack.java:31)
... 15 more
Caused by: java.lang.ExceptionInInitializerError
at org.msgpack.template.TemplateRegistry.<clinit>(TemplateRegistry.java:38)
... 17 more
Caused by: java.lang.VerifyError: org.msgpack.template.BeansFieldEntryReader
at org.msgpack.template.builder.BeansTemplateBuilder.<init (BeansTemplateBuilder.java:42)
at org.msgpack.template.builder.BuilderSelectorRegistry.initForJava(BuilderSelectorRegistry.java:73)
at org.msgpack.template.builder.BuilderSelectorRegistry.<clinit>(BuilderSelectorRegistry.java:38)
... 18 more
Run Code Online (Sandbox Code Playgroud)
我使用的代码非常简单
PrintWriter out = new PrintWriter(socket.getOutputStream());
Message msg = new Message();
msg.body = "asdasdasd";
msg.from = "qwe";
msg.to = "ttt";
byte[] bytes = MessagePack.pack(msg);
out.print(bytes);
out.flush();
Run Code Online (Sandbox Code Playgroud)
我有javassist.jar,msgpack-0.5.2.jar,slf4j-api-1.6.2.jar和slf4j-jdk14-1.6.2.jar在我的lib目录中.
在我的服务器应用程序中,此代码可以使用相同的库.
官方MessagePack页面链接到页面:
但它的最后一次更新是三年前.另一方面,JavaScript中还有其他MessagePack实现,例如:
他们之间有什么不同?哪一个是最正宗的?我应该使用哪一个?
这几天我一直在阅读很多关于Avro和Messagepack的文章.不知道何时使用哪一个.我遇到的一个主要问题是两者在以下指标上的表现差异:
该MessagePack规范可帮助您了解可用的数据类型及其二进制表示.但是,我找不到必须用于构建有效msgpack结构的"语法"的信息(因为它不是文本而是二进制格式,术语"语法"可能不准确).我特别想知道msgpack结构中是否有关于"顶级"元素的要求.这基本上是与JSON 不久前发生的问题类似的问题,尽管JSON的语法是指定的.
使用msgpack,可以在顶层使用基本类型(Int,Boolean ..),还是必须将所有内容封装在地图/数组中?是否有可能在顶层有多个元素(例如,两个数组,不是嵌套,而是"彼此相邻")?
我正在尝试通过WebSocket将来自Cowboy的MessagePack编码消息发送到浏览器,并且接收的数据始终为空或无效.我能够将JS中的二进制数据发送给我的牛仔处理程序,但反之亦然.我正在使用Cowboy 1.0.4和官方msgpack-erlang应用程序.我也msgpack-lite用于我的浏览器中的JavaScript.
例子:
websocket_handler:
websocket_handle({text, <<"return encoded">>}, Req, State) ->
%% sends encoded message to client. Client is unable to decode and fails
{reply, {binary, msgpack:pack(<<"message">>)}, Req, State};
websocket_handle({binary, Encoded}, Req, State) ->
%% Works as expected
lager:info("Received encoded message: ~p", [msgpack:unpack(Encoded)]),
{ok, Req, State};
Run Code Online (Sandbox Code Playgroud)
JS:
var host = "ws://" + window.location.host + "/websocket";
window.socket = new WebSocket(host);
socket.binaryType = 'arraybuffer';
socket.onmessage = function(event) {
var message = msgpack.decode(event.data);
console.log(message);
};
Run Code Online (Sandbox Code Playgroud)
浏览器在msgpack.min.js中返回错误:
Error: Invalid type: …Run Code Online (Sandbox Code Playgroud) 我刚安装了node-msgpack并针对原生JSON进行了测试.MessagePack慢得多.谁知道为什么?
使用作者自己的基准......
node ~/node_modules/msgpack/bench.js
msgpack pack: 4165 ms
msgpack unpack: 1589 ms
json pack: 1352 ms
json unpack: 761 ms
Run Code Online (Sandbox Code Playgroud) 我在Redis中存储MessagePacked哈希时遇到问题.我在下面粘贴了一个测试用例.从Redis中提取打包数据并解压缩时,哈希略有损坏.这似乎发生在哈希值超出一定长度时,尽管我不能肯定地说.
我使用的是Redis 2.4.17(默认配置),Ruby 1.9.3p194,MessagePack 0.4.7和Redis gem 3.0.2.使用节点会发生同样的问题,所以我假设问题出在MessagePack或Redis中.有任何想法吗?
require 'redis'
require 'msgpack'
class Test
def self.run(url)
redis = Redis.new
data = {'number' => 13498935756, 'hash' => {'url' => url}}
redis.set('my_key', MessagePack.pack(data))
result = MessagePack.unpack(redis.get('my_key'))
puts result
puts result['hash']['url'] == data['hash']['url']
end
end
Test.run('http://fake.example.com') # works
=> {"number"=>13498935756, "hash"=>{"url"=>"http://fake.example.com"}}
=> true
Test.run('http://fakeurl.example.com') # does not work
=> {"number"=>13498935756, "hash"=>{"url"=>"ttp://fakeurl.example.com"}}
=> false
Run Code Online (Sandbox Code Playgroud) MsgPack C ++中有没有一种方法可以使用MSGPACK_DEFINE而不更改类成员?我们希望将消息包的内容保留在标头之外,而仅在库中内部使用。
似乎只包装每个类都可以,但是希望有更好的方法。