31

ZeroMQ FAQページは、メッセージコンテンツをシリアル化する方法としてGoogleのprotobufを使用することを提案しています。

誰かが良い使用例を見たことがありますか?

また、「メッセージをシリアル化する最大の利点は何ですか?」という答えを得る必要があります。-それがなくても生活でき、よりスリムなパイプラインを利用できるものかどうか。

.proto私はファイルとprotocコンパイラのアイデアがとても好きです。

また、遊び場に投げるもう1つの優れたツールはlibev、コメントを歓迎します:)

4

4 に答える 4

25

ZMQ を介して通信するプログラムが常に互いのバイナリ形式を理解できると 100% 確信している場合 (たとえば、それらは常に一緒に配布され、すべて同じコンパイラ オプションでコンパイルされているため)シリアライゼーションによって追加されるオーバーヘッドにメリットがあります。

上記の条件が満たされない場合 (異なるホスト タイプで実行されるパートナー プログラム、異なる言語で記述されたプログラム、時間の経過とともに独立して進化する可能性のあるパートナー プログラムなど - 生のバイナリ構造に非互換性が生じる可能性がある) とすぐに、シリアライゼーションはかなりの確率でしなければならない。

今日では、誰もが、そしてその兄弟がシリアライゼーション ソリューションを作成しているようです。これは、万能のソリューションがないことを示している可能性があります。 このページには、シリアライゼーション時間、デシリアライゼーション時間、および 27 (!!) の異なるシリアライゼーション システムのサイズのかなり徹底的なベンチマークが含まれています。そのページの最初の段落をスキップしないでください。「警告、ベンチマークは誤解を招く可能性があります」と書かれています。アプリケーション、データはあなたにとって重要ですが、そこに提示されたデータは、詳細に研究したい選択肢を絞り込むのに役立つ場合があります.

于 2011-09-12T16:14:31.233 に答える
21

これは、JavaおよびC++でメッセージを送受信するサンプルです。

Javaでのシリアル化:

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

Javaでの逆シリアル化:

byte[] reply = socket.recv(0);
Person person2 = Person.parseFrom(reply);

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);

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());
于 2013-02-19T10:03:21.060 に答える
3

0mq の PUB/SUB が protobuf で機能するかどうかはわかりません.0mq はメッセージの先頭に文字列トピックを期待しているためです..しかし、protobuf はフィールド記述子を最初に置きます。

実際には、ここに解決策へのリンクがあります。

http://www.dotkam.com/2011/09/09/zeromq-and-google-protocol-buffers/

乾杯

于 2012-10-01T23:55:38.143 に答える