ZeroMQ +协议缓冲区

err*_*per 31 protocols network-protocols zeromq

ZeroMQ常见问题解答页面建议使用Google的protobuf作为序列化邮件内容的方法.

有没有人看到一个很好的用法示例?

我还需要得到"序列化消息的最大优势是什么?"的答案. - 它是否可能是我可以生活的东西,并利用更细长的管道.

我非常喜欢.proto文件和protoc编译器的想法.

此外,似乎另一个伟大的工具扔在操场上libev,欢迎任何评论:)

fvu*_*fvu 22

如果您100%确定将通过ZMQ进行通信的程序将始终能够理解彼此的二进制格式(例如,因为它们总是分布在一起并且无论如何都使用相同的编译器选项编译)我看到没有受益于序列化添加的开销.

一旦上述条件无法满足(例如在不同主机类型上运行的伙伴程序,用不同语言编写的程序,甚至可以及时独立发展的伙伴程序 - 这可能导致其原始二进制结构不兼容)序列化很可能成为一个必须.

现在似乎每个人和他们的兄弟都在创建序列化解决方案,这可能表明没有一种尺寸适合所有解决方案. 该页面包含27(!!)个不同序列化系统的序列化时间,反序列化时间和大小的完整基准.不要跳过该页面的第一段,它说"警告,基准可能会误导".您的应用程序,您的数据对您来说很重要,但是那里提供的数据可能会帮助您缩小您想要详细研究的选择范围.


Cha*_*ara 15

这是一个通过java和C++发送和接收消息的示例:

在java中序列化:

Person person = Person.newBuilder().setName("chand")
    .setEmail("chand@test.com").setId(55555).build();
socket.send(person.toByteArray(), 0);
Run Code Online (Sandbox Code Playgroud)

在java中反序列化:

byte[] reply = socket.recv(0);
Person person2 = Person.parseFrom(reply);
Run Code Online (Sandbox Code Playgroud)

在C++中序列化:

Person p = Person();
std::string str;
p.SerializeToString(&str);
int sz = str.length();
zmq::message_t *query = new message_t(sz);
memcpy(query->data (), str.c_str(), sz);
socket->send (*query);
Run Code Online (Sandbox Code Playgroud)

在C++中反序列化

zmq::message_t resultset(100);
socket->recv (&resultset);

Person p = Person();
p.ParseFromArray(resultset.data(), resultset.size());
printf("\n Server : %s", p.name().c_str());
Run Code Online (Sandbox Code Playgroud)