标签: msgpack

C++ MsgPack:链接器错误

我正在尝试编译消息包(http://msgpack.org/)示例代码并继续得到这些我无法得到的错误:

g++ -o"MsgPack2" ./src/MsgPack2.o -lmsgpack -lmsgpackc

./src/MsgPack2.o: In function `main':
/mnt/eoh/workspace/MsgPack2/Debug/../src/MsgPack2.cpp:38:
Run Code Online (Sandbox Code Playgroud)

msgpack::rpc::server::listen(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned short)' ./src/MsgPack2.o: In function循环'的未定义引用:/usr/local/include/msgpack/rpc/loop.h:30:对 mp::wavy::loop::loop()' ./src/MsgPack2.o: In functionbase'的未定义引用:/usr/local/include/msgpack/rpc/server.h:msgpack::rpc::server::server(msgpack::rpc::loop)' /usr/local/include/msgpack/rpc/server.h:59: undefined reference to 59 :对msgpack的未定义引用 :: rpc :: server :: serve(msgpack :: rpc :: dispatcher*)' msgpack::rpc::server::~server()' ./src/MsgPack2.o: In function/ usr/local/include/msgpack/rrp/server.h:59:对~base'的未定义引用 :/ usr/local/include /msgpack/rpc/server.h:64:对msgpack::rpc::server::~server()' ./src/MsgPack2.o: In function myserver :: dispatch(msgpack :: rpc :: request)'的未定义引用 :/ mnt /eoh/workspace/MsgPack2/Debug/../src/MsgPack2.cpp:14 :对msgpack::rpc::request::method()' /mnt/eoh/workspace/MsgPack2/Debug/../src/MsgPack2.cpp:18: undefined reference tomsgpack :: rpc :: request :: …

c++ linker msgpack

5
推荐指数
1
解决办法
1469
查看次数

编码包含Node.js缓冲区的MessagePack对象

我正在使用node-msgpack来编码和解码在机器之间传递的消息.我希望能够做的一件事是将原始缓冲区数据包装在一个对象中并使用Messagepack对其进行编码.

msgpack = require('msgpack')
buf = <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 ...>
obj = {foo: buf}
packed = msgpack.pack(obj)
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我想对嵌套在对象中的缓冲区的原始字节进行一致性检查.所以buf得到如此:

var buf = fs.readFileSync('some_image.png');
Run Code Online (Sandbox Code Playgroud)

在一个完美的世界里,我会得到:

new Buffer(msgpack.unpack(packed).foo);

#> <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 ...>
Run Code Online (Sandbox Code Playgroud)

相反,我最终得到一些随机数.深入挖掘,我最终得到以下好奇心:

enc = 'ascii'
new Buffer(buf.toString(enc), enc)
#> <Buffer *ef bf bd* 50 4e …
Run Code Online (Sandbox Code Playgroud)

javascript node.js msgpack

5
推荐指数
1
解决办法
2164
查看次数

使用MSGPACK_DEFINE而不更改类声明

MsgPack C ++中有没有一种方法可以使用MSGPACK_DEFINE而不更改类成员?我们希望将消息包的内容保留在标头之外,而仅在库中内部使用。

似乎只包装每个类都可以,但是希望有更好的方法。

c++ messagepack msgpack

5
推荐指数
1
解决办法
1264
查看次数

使用C++中的MessagePack反序列化异构映射

我正在使用带有C++的MessagePack,我正在尝试反序列化这个Python映射的等价物:

{'metadata': {'date': '2014-06-25', 'user_id': 501},
 'values': [3.0, 4.0, 5.0],
 'version': 1}
Run Code Online (Sandbox Code Playgroud)

顶级对象是带有字符串键的映射,但值的类型完全不同.我的代码提前知道对象的结构应该是什么; 我应该能够声明一个整数,然后告诉我的反序列化代码," version键的值是一个整数,所以将该整数的值放入这个内存地址."

问题是我甚至不确定如何达到我的C++代码可以将此结构视为地图的程度.我期待做类似的事情

msgpack::unpacker unpacker;
// ...copy the data into unpacker's buffer...

msgpack::unpacked message;
std::map<std::string, anything> output_map;

unpacker.next(&message);
msgpack::object obj = message.get();
obj.convert(&output_map);

int version_number = output_map.at("version");
Run Code Online (Sandbox Code Playgroud)

有没有可能的类型(anything)在这里工作?MessagePack文档只有一些简单的例子,这篇博文更好,但不包括这个用例.

c++ msgpack

5
推荐指数
1
解决办法
3112
查看次数

如何使用ruby-msgpack gem存储32位浮点数?

我正在研究一个需要存储大量简单,可扩展数据的数据系统(以及我们在内部开发的一些专业索引,而不是这个问题的一部分).我希望存储数十亿条记录,因此高效的序列化是系统的关键部分.序列化需要快速,节省空间,并且支持多种平台和语言(因为打包和解包这些数据将是客户端组件的责任,而不是存储系统的一部分)

数据类型实际上是具有可选键/值对的散列.键将是小整数(在应用程序层解释).值可以是各种简单数据类型 - String,Integer,Float.

作为一种技术选择,我们选择了MessagePack,并且我正在编写代码来通过Ruby的msgpack-ruby gem 执行数据序列化.

我不需要Ruby的64位Float的精度.即使对于32位的限制,存储的数字也没有任何有意义的精度.所以我想使用MessagePack支持32位浮点值.这肯定存在.但是,Ruby在任何64位系统上的默认行为是将Float序列化为64位:

MessagePack.pack(10.3)
 => "\xCB@$\x99\x99\x99\x99\x99\x9A"
Run Code Online (Sandbox Code Playgroud)

看看MessagePack代码,似乎有一种方法MessagePack::Packer#write_float32,这就是我所期望的:

MessagePack::DefaultFactory.packer.write_float32(10.3).to_s
 => "\xCAA$\xCC\xCD"
Run Code Online (Sandbox Code Playgroud)

...但我找不到设置默认打包器或创建新打包器的方法,在序列化更大的结构时将使用此方法.

作为对我的理解的考验,我尝试了这个:

class Float
  def to_msgpack_ext
    packer.write_float32(self)
  end

  def self.from_msgpack_ext s
    unpacker.read(s)
  end
end

MessagePack::DefaultFactory.register_type(0, Float )

MessagePack.pack(10.3)
 => "\xCB@$\x99\x99\x99\x99\x99\x9A"
Run Code Online (Sandbox Code Playgroud)

没有任何区别...很明显,我对MessagePack中使用的对象模型缺失或误解.我想做什么,我需要做什么?

ruby msgpack

5
推荐指数
1
解决办法
141
查看次数

MessagePack,c++:如何将 MSGPACK_DEFINE 与 c++11 枚举类一起使用

以下示例无法编译,抱怨说

In file included from /usr/include/msgpack.hpp:18:
/usr/include/msgpack/object.hpp:211:3: error: member reference base type 'logd::log_level' is not a structure or union
Run Code Online (Sandbox Code Playgroud)

以及另一个枚举类的相应错误。我的问题是如何使用 msgpack 的 c++ api 序列化具有 c++11enum class类型成员的类?

#ifndef LOG_MSG_HPP_
#define LOG_MSG_HPP_

#include <stdlib.h>
#include <msgpack.hpp>

/** @namespace logd */
namespace logd {

enum class log_level { SILENT,... DEBUG };

enum class log_domain { AI, ...  MISC };

class log_msg {
    public:
        log_msg(log_level lev, log_domain dom, std::string msg);
        log_level level();
        log_domain domain();
        std::string message();
        ~log_msg();
        MSGPACK_DEFINE(lev_, dom_, msg_);

    private: …
Run Code Online (Sandbox Code Playgroud)

c++ enums serialization msgpack c++11

4
推荐指数
1
解决办法
4215
查看次数

msgpack:haskell&python

我对msgpack的haskellpython客户端之间的差异感到困惑.这个:

import Data.MessagePack as MP
import Data.ByteString.Lazy as BL

BL.writeFile "test_haskell" $ MP.pack (0, 2, 28, ())
Run Code Online (Sandbox Code Playgroud)

还有这个:

import msgpack

with open("test_python", "w") as f:
    f.write(msgpack.packb([0, 2, 28, []]))
Run Code Online (Sandbox Code Playgroud)

给我不同的文件:

$ diff test_haskell test_python
Binary files test_haskell and test_python differ
Run Code Online (Sandbox Code Playgroud)

谁能解释一下,我做错了什么?也许我误解了一些关于ByteString用法的事情?

python haskell msgpack

4
推荐指数
1
解决办法
344
查看次数

msgpack反序列化dict密钥字符串转换为字节

msgpack在python中遇到问题。似乎在序列化a时dict,如果键是字符串str,则它们不会正确地反序列化并导致引发KeyError异常。

例:

>>> import msgpack
>>> d = dict()
>>> value = 1234
>>> d['key'] = value
>>> binary = msgpack.dumps(d)
>>> new_d = msgpack.loads(binary)
>>> new_d['key']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'key'
Run Code Online (Sandbox Code Playgroud)

这是因为键在调用后不是字符串,loads()而是未序列化为bytes对象。

>>> d.keys()
dict_keys(['key'])
>>> new_d.keys()
dict_keys([b'key'])
Run Code Online (Sandbox Code Playgroud)

似乎这与github中提到的未实现功能有关

我的问题是,是否有一种方法可以解决此问题或解决此问题,以确保在反序列化时可以使用相同的密钥?

我想使用,msgpack但是如果我无法dict使用str键构建对象,并且期望能够在反序列化时使用相同的键,它将变得毫无用处。

python msgpack

4
推荐指数
1
解决办法
1016
查看次数

如何将字节数组存储到StackExchange.Redis?

我想使用MessagePack,ZeroFormatterprotobuf-net序列化/反序列化通用列表,并使用stackexchange.redis客户端将其存储在Redis中.

现在我正在使用该StringSetAsync()方法存储JSON字符串.但我找不到任何关于如何byte[]在Redis中存储的文档.

protobuf-net redis msgpack stackexchange.redis zeroformatter

4
推荐指数
1
解决办法
2680
查看次数

长期归档数据格式的二进制序列化(Protobuf、CBOR、MessagePack 等)的注意事项

在对下一代科学数据格式的讨论中,已经确定需要某种类似 JSON 的数据结构(字段的逻辑分组)。此外,最好利用现有的编码而不是使用自定义的二进制结构。对于序列化格式有很多选择。对于那些具有此类编码经验的人的任何指导或见解表示赞赏。

要求:在我们的格式中,数据需要打包在记录中,通常不大于 4096 字节。每条记录必须可独立使用。数据必须在未来几十年内可读。数据归档和交换是通过存储和传输一系列记录来完成的。数据损坏必须只影响损坏的记录,使文件/流/对象中的所有其他记录都可读。

优先级(大致按顺序)是:

  • 稳定性,长期存档使用
  • 性能,主要是阅读
  • 存储不透明斑点的能力
  • 尺寸
  • 简单
  • 广泛的软件(又名库)支持
  • 流能力,在生成记录时传输和可读(如果可能)

我们已经开始研究 Protobuf ( Protocol Buffers RFC )、CBOR ( RFC ) 和一些MessagePack

那些有经验的人提供的任何可以帮助我们确定最合适的信息,或者更重要的是,避免陷阱和死胡同的信息,我们将不胜感激。

提前致谢!

format json protocol-buffers msgpack cbor

3
推荐指数
1
解决办法
8632
查看次数