5

C++ パケットをネットワーク ストリームにシリアル化するためのソリューションを探しています。

ここで人々に言及する多くの投稿を見てきました:

  1. エース

  2. Google プロトコル バッファ

  3. Boost::シリアル化

  4. Qt ::QDataStream

私の要件/制約:

  1. ソリューションは、LitteEndian/BigEndian を認識しない必要があります。マシン アーキテクチャ x86/x64 およびプラットフォームに依存しません。

  2. 最初の 3 つのソリューションのフット プリント (RAM と ROM) は、私のプラットフォームには大きすぎます。4 番目のソリューションは、次の要件と矛盾しています。

  3. このソリューションでは、大量のボイラープレート コードは必要ありません (シリアル化する必要がある 200 以上のパケットがあります)。

ありがとう、コビー・メイア

4

5 に答える 5

13

Google Protocol Buffers が重すぎる場合 (コンパイルされたライブラリは 1 MB 以上かかる可能性があるため、これには同意できます)、数倍小さい protobufのライト バージョンを試すことができます。次の行を挿入することにより、*.proto ファイルで有効にすることができます。

option optimize_for = LITE_RUNTIME;

しかし、最小限のオーバーヘッドで protobuf ソリューションが必要な場合は、protobuf の C 実装であるprotobuf -cを使用します。
使用するのは少し難しくなりますが、バイナリ コード サイズのオーバーヘッドは最小限に抑える必要があります (30 ~ 50 KB)。この C 実装は、たとえばumurmur (組み込み Linux ARM および MIPS ルーターで非常にうまく動作する音声サーバー) で使用されていることを知っています。

于 2011-04-11T16:19:09.850 に答える
1

別の考え: テキストとしてシリアライズし、反対側で解析します。

これは頻繁に行われます (TCP、UDP、シリアル、その他のプロトコル)。ロボット制御システム、ラボ情報管理システム、および多くのベンダー間の「接続」が役立つその他の場所のように、このアプローチには非常に優先順位があります。誰もがプレーンテキスト (ASCII または UTF-8) を送信するだけで、読みやすく、デバッグしやすく、リバースエンジニアリングしやすく、修復/フックインしやすい. (不透明にしたい場合は、公開/秘密鍵のようにペイロードを暗号化できます。)

これは、エンディエンネスに依存しない/異なるプラットフォーム要件の要件に適合します。私たちは XML を使用しました。XML は正常に機能し、"Key=Value" 値として必要なものに対する参照オントロジーを備えたかなり "標準" ですが、"名前付きセクション" を使用する INI スタイルの形式を好む傾向があります。 」 より複雑になります。たくさんのものを「ネスト」する場合は、JSON のような実装に目を向けるかもしれません (非常に簡単です)。

ASCII、IMHOに強い投票。

于 2011-04-11T16:30:42.700 に答える
1

うわー、ACE、シリアライゼーションを強化してください...これらのフレームワークにはシリアライゼーションが組み込まれていますが、シリアライゼーションだけを見るのは、CD プレーヤーが必要なために車を購入するようなものです。SUN/DEC RPC は、XDR と呼ばれる形式を使用します。これは、Steven の「UNIX ネットワーク プログラミング」で非常によく説明されています。基本的に、これは 1000 LOC ヘッダー/c ファイルです。一人で使えること。CORBA は、その下で XDR も使用します。Googleコードで「xdr.h」を探してください-OSS実装がたくさんあります。それでも洗練されたものが必要な場合は、ASN.1 が最も包括的なソリューションであり、ほとんどのアプリケーションで必要とされるよりも少し複雑ですが、ASN.1 コンパイラはコンパクトなコードを生成します。主に通信スタック、cll 電話、GSM メッセージングなどで使用されます。ASN.1 は RSA キーのエンコードに使用されます。

于 2011-04-16T18:39:25.723 に答える
0

マイクロソフトがMFCで使用したのと同じ手法を使用して、このようなものを実装しました。基本的に、各シリアル化可能なクラスにメソッドを実装して、そのクラスから保存したいものをシリアル化および逆シリアル化します。非常に軽量で高速です。

Microsoftが使用した「アーカイブ」クラスの代わりに、バイナリストリームクラスを使用しました。私の要件はエンディアンの認識を必要としませんでしたが、POD変数をシリアル化するための基本クラスを実装する場合、実装するのは簡単です。

于 2011-04-11T17:19:19.423 に答える
0

独自の最終的なソリューションを展開する必要があると思いますが、使用できる構成要素がいくつかあります。

  • Boost::Spirit (シリアル化する Karma、逆シリアル化する Qi)
    はまだ大きすぎる可能性があります。その場合、Barton-Nackman のイディオムを使用してコードが読みやすく、単純serializeな関数を使用する
  • Arachnidaなどの軽量通信レイヤー(HTTP 機能を使用せずに、通信のみに使用できます)。
    クモ類は OpenSSL をベースに構築されています。それもあなたにとって重すぎる場合は、本当に自分で巻く必要があります。

リトル/ビッグエンディアンの無知/知識は、ほとんどシリアライゼーションコードの手に委ねられます..

幸運を

于 2011-04-11T15:53:12.583 に答える