12

サーバーとエンドポイントが通信する形式を選択するのに苦労しています。
私は検討しています:

  • JSON
  • YAML 解析が難しすぎる
  • CSV
  • Google Protobufs
  • バイナリのパッキング/アンパッキング(移植性を有効にするためにcasting / memset / memcpyを使用しない)
  • DSLのいくつかの形式
  • あなたが持っているかもしれない他の提案

私の基準は、最も重要なものから最も重要でないものの順に並べられています。

  1. 解析するのが最も簡単なのはどれですか?
  2. 解析するのに最も速いのはどれですか?
  3. バイト単位で最小のものはどれですか?
  4. 最も読みやすいメッセージが表示される可能性があるのはどれですか?
  5. より簡単に暗号化できる可能性があるのはどれですか?
  6. どちらがより簡単に圧縮される可能性がありますか?

明確にするために編集:

  • データ転送は双方向ですか?はい。
  • 物理的な輸送とは何ですか?イーサネット。
  • データはパケットまたはストリームとしてフォーマットされていますか?両方ですが、通常はパケットです。
  • エンドポイントにはどのくらいのRAMがありますか?可能な限り最小の量で、私が選択したフォーマットに依存します。
  • あなたのデータはどれくらいの大きさですか?必要なだけの大きさ。ただし、巨大なデータセットは受け取りません。
  • エンドポイントにはRTOSがありますか?いいえ。
4

8 に答える 8

5

主な要因は次のとおりです。

  • クライアントにはどのような機能がありますか?(たとえば、パフォーマンス上の理由からほとんどのXMLパーサーを除外せずに、シェルフからXMLパーサーを選択できますか?その場でパケットを圧縮できますか?)
  • データの複雑さはどのくらいですか(「フラット」または深く構造化されていますか?)
  • 高周波アップデートが必要ですか?部分的な更新?

私の経験では:

のインターフェイスを備えた単純なテキストプロトコル(DSLとして分類されます)

string RunCommand(string commandAndParams)
// e.g. RunCommand("version") returns "1.23"

デバッグ、ロギングとトレース、プロトコルの拡張など、多くの側面が簡単になります。デバイス用のシンプルな端末/コンソールを持つことは、問題の追跡、テストの実行などに非常に役立ちます。

他の形式の参照点として、制限について詳しく説明しましょう。

  • クライアントはマイクロパーサーを実行する必要があります。思ったほど複雑ではありませんが(私の「マイクロパーサーライブラリ」のコアは、合計約200行のコードを持つ10個の関数です)、基本的な文字列処理が可能であるはずです。
  • ひどく書かれたパーサーは大きな攻撃対象領域です。デバイスがクリティカル/センシティブである場合、または敵対的な環境で実行されることが予想される場合、実装には細心の注意が必要です。(これは他のプロトコルにも当てはまりますが、すぐにハッキングされたテキストパーサーは間違えやすいです)
  • オーバーヘッド。混合テキスト/バイナリプロトコル、またはbase64(37%のオーバーヘッドがある)によって制限できます。
  • レイテンシー。通常のネットワーク遅延では、多くの小さなコマンドを発行する必要はありません。リクエストをバッチ処理する何らかの方法とそのリターンが役立ちます。
  • エンコーディング。ASCIIで表現できない文字列を転送する必要があり、両端でUTF-8のようなものを使用できない場合、テキストベースのプロトコルの利点は急速に低下します。

バイナリプロトコルを使用するのは、デバイスから要求された場合、デバイスの処理能力がめちゃくちゃ低い場合(たとえば、256バイトのRAMを搭載したUSBコントローラー)、または帯域幅が大幅に制限されている場合のみです。私が使用したプロトコルのほとんどはそれを使用しており、それは苦痛です。

Google protBufは、バイナリプロトコルをいくらか簡単にするためのアプローチです。ライブラリを両端で実行でき、フォーマットを定義するのに十分な自由がある場合は、良い選択です。

CSVは、大量のデータを簡単に解析できる形式にパックする方法であるため、テキスト形式の拡張です。ただし、構造は非常に限られています。データが適切であることがわかっている場合にのみ、これを使用します。

XML / YAML / ...処理能力が問題ではなく、帯域幅が問題ではないか、オンザフライで圧縮でき、データの構造が非常に複雑な場合にのみ使用します。JSONは、オーバーヘッドとパーサーの要件が少し軽いようですが、良い妥協案かもしれません。

于 2010-08-04T09:06:49.470 に答える
3

通常、これらの場合、デバイスのデータ形式をカスタマイズするのにお金がかかります。たとえば、ネットワークまたはストレージサイズに関する制限に応じて、ストリーミング圧縮を選択することも、完全圧縮を選択することもできます。また、保存するデータの種類も大きな要因です。

本当に最大の問題が解析のしやすさである場合は、xmlを使用する必要がありますが、組み込みデバイスでは、転送速度、ストレージサイズ、CPU消費量と比較して、通常、解析のしやすさはそれほど問題になりません。JSONとYAMLは、XMLと同様に、何よりもまず簡単さの解析に重点を置いています。Protobufはそこに押し込まれる可能性があり、バイナリパッキングは人々が通常行うことです。暗号化と圧縮は、トランスポートレベルで行う必要がありますが、機能的には、メッセージに含める情報をできるだけ少なくすることを目的とする必要があります。

私はあなたに明確な答えを与えていないことを知っていますが、そのような一般的な質問にはそのようなことはないと思います。

于 2010-08-02T08:28:34.003 に答える
3

まず第一に、あなたが見つけることができる既存の図書館の種類を見てください。フォーマットの解析が難しい場合でも、事前に作成されたライブラリを使用すると、フォーマットをより魅力的にすることができます。解析するのに最も簡単な形式は、すでにパーサーを持っている形式です。

解析速度は通常、バイナリ形式で最高です。最も高速な方法の1つは、「フラット」バイナリ形式を使用することです(バッファーを読み取り、データ構造へのポインターとしてバッファーへのポインターをキャストし、データ構造を介してバッファー内のデータにアクセスします)。メモリ領域のバイナリダンプを(基本的に)転送するため、実際の「解析」は必要ありません。

ペイロードを最小限に抑えるには、特定のニーズに合わせて調整されたカスタムバイナリ形式を作成します。このようにして、さまざまな設計のトレードオフを最大の利点に合わせて調整できます。

「読み取り可能」は主観的です。誰が読める?XMLやCSVなどのプレーンテキスト形式は、人間が簡単に読み取ることができます。フラットなバイナリイメージは、マシンで簡単に読み取ることができます。

暗号化ルーチンは通常、圧縮されるデータをバイナリデータのチャンクとして扱います(データをまったく解釈しようとはしません)。したがって、暗号化はどの形式のデータにも同様に適用できます。

テキストベースの形式(XML、CSVなど)は非常に圧縮可能である傾向があります。バイナリ形式は圧縮性が低い傾向がありますが、そもそも「無駄な」ビットが少なくなります。

私の経験では、次のことで最高の結果が得られました。

  • CSV-データが予測可能で一貫性のある形式である場合に最適です。スクリプト言語と通信する場合にも役立ちます(テキストベースのI/OはバイナリI/Oよりも簡単です)。手作業で簡単に生成/解釈できます。
  • フラットバイナリ-データ構造(POD)をある場所から別の場所に転送する場合に最適です。最良の結果を得るには、構造をパックして、さまざまなパディングを使用するさまざまなコンパイラーでの問題を回避してください。
  • カスタムフォーマット-カスタムフォーマットを設計すると、柔軟性、オーバーヘッド、および読みやすさのバランスをとることができるため、通常、最良の結果が得られます。残念ながら、カスタムフォーマットを最初から設計すると、見た目よりもはるかに多くの作業が必要になる可能性があります。
于 2010-08-02T21:33:24.853 に答える
2

最初の質問に対する答えは、何をしようとしているかによって大きく異なります。あなたの質問に付けられたタグから、あなたのエンドポイントは組み込みシステムであり、あなたのサーバーはある種のPCであることがわかります。PCでのXMLの解析は簡単ですが、組み込みシステムでは少し難しくなります。また、コミュニケーションが双方向であるかどうかについても言及していません。あなたの場合、エンドポイントがサーバーにデータを渡すだけで、その逆ではない場合、XMLはうまく機能する可能性があります。サーバーがデータをエンドポイントに渡す場合は、CSVまたは独自のバイナリ形式の方がエンドポイントで解析する方がおそらく簡単です。CSVとXMLはどちらも、人間が簡単に読める形式です。

  • データ転送は双方向ですか?
  • 物理的な輸送とは何ですか?(例:RS-232、イーサネット、USB?)
  • データはパケットまたはストリームとしてフォーマットされていますか?
  • エンドポイントにはどのくらいのRAMがありますか?あなたのデータはどれくらいの大きさですか?
  • エンドポイントにはRTOSがありますか?
于 2010-08-02T20:50:39.123 に答える
2

CSVは、XMLベースのソリューションよりも先にあなたの要望に応えます。非常に簡単に解析でき、1〜20行のコードです。次に、ソリューションに必要な用語/フィールドの意味を追加します。CSVのオーバーヘッドは非常に軽く、一部のコンマと引用符は、実際の肉/データよりも多くのXMLタグと構文を見つけることが多いXMLソリューションと比較して、単一の8ビットまたは32ビット値に対して数十から数百バイトが書き込まれることがよくあります。付与されたCSVには、バイナリと比較して1つの8ビット値(hexchar hexcharコンマ)を表すのに3文字(バイト)かかると思われる場合にもオーバーヘッドがあります。バルクを含む非圧縮のXMLソリューションは、作成と解析、場合によっては圧縮/解凍に使用されるかさばるライブラリに加えて、かなり多くの伝送帯域幅とストレージを消費します。xmlは非常に冗長であり、一度に1つの画面にすべての関連データを表示できないため、CSVはバイナリよりも確実に読みやすく、XMLよりも読みやすいことがよくあります。誰もが優れたスプレッドシートツール、gnumeric、openoffice、ms officeにアクセスできるため、CSVの読み取り/使用がはるかに簡単になり、GUIはすでに存在します。

一般的な答えはありませんが、これについてシステムエンジニアリングを行う必要があります。ホストまたは大きなコンピューター側でJSON/XMLを使用し、送信用にバイナリなどの他の形式に変換することをお勧めします。組み込み側では、ASCIIはまったく必要なく、エネルギーを浪費する必要もありません。バイナリデータを取得して使用します。また、組み込みの定義もわかりません。ASCII形式について話しているので、これはリソースが制限されたマイクロコントローラーではなく、おそらく組み込みLinuxまたはその他のオペレーティングシステムです。システムエンジニアリングの観点から、組み込みシステムには正確に何が必要であり、どのような形式であるのでしょうか。その1つ上のレベルで、どのようなリソースがあり、その結果、どのような形式でそのデータを組み込みシステムに保持したいのか、組み込みシステムは、事前にフォーマットされたバイナリを取得し、データが意図された周辺機器にバイトを直接渡すことを望んでいますか?その場合、組み込みドライバーは非常にダム/シンプル/信頼性が高く、作業とデバッグの大部分は、データをフォーマットするための十分なリソースと馬力があるホスト側で行われます。最小限のフォーマットとオーバーヘッドを目指します。解析するためにライブラリを含める必要がある場合は、使用しない可能性があります。しかし、私はオペレーティングシステムなしでリソースが限られた組み込みシステムで作業することがよくあります。

于 2010-08-02T14:07:06.050 に答える
1

SDカードから組み込みプロセッサにデータを読み取るのと同じようなことをしている最中です。カード上のデータのコンパクトさと翻訳のしやすさ、および子会社や潜在的な顧客がデータを読み取る能力について考える必要があります。

データが人間によって頻繁に読み取られていない場合、変換ツールは最善の妥協案を提供する可能性がありますが、変換ツールを提供する必要がある場合、これは多くの追加サポートになります(最新バージョンのWindows、Linuxなど)。

私の状況では、CSVは、簡単に利用できるcsvエディター(Excelなど)がたくさんあり、csvファイルの作成/編集方法に関するドキュメントを提供するだけでよいため、アプリケーションに妥当な妥協点を示しています。CSVが完全に定義された標準ではないのは苦痛ですが、RFC4180は目標とするのに適したcsv「標準」です。

https://www.rfc-editor.org/rfc/rfc4180

別の答えが言ったように、私はあなたに明確な答えを与えることはできませんが、あなたが特定したように、それはすべての人によるシステムの保守性と組み込みソリューションの速度とサイズの間の妥協点になります(つまりそれは機能します!)。

幸運を!

于 2010-08-02T14:05:47.180 に答える
1

YAML Webサイトから:

JSONとYAMLはどちらも、人間が読めるデータ交換形式を目指しています。ただし、JSONとYAMLの優先順位は異なります。JSONの最も重要な設計目標は、シンプルさと普遍性です。したがって、J SONは、人間の可読性が低下するという犠牲を払って、生成および解析するのは簡単です。また、最小公分母の情報モデルを使用して、JSONデータをすべての最新のプログラミング環境で簡単に処理できるようにします。

対照的に、YAMLの最も重要な設計目標は、人間の可読性と任意のネイティブデータ構造のシリアル化のサポートです。したがって、YAMLは非常に読みやすいファイルを可能にしますが、生成と解析はより複雑です。さらに、YAMLは最小公分母のデータ型を超えて冒険し、異なるプログラミング環境間を移動するときに、より複雑な処理を必要とします

つまり、JSONは人間が読める形式であり、YAMLの方が効率的であるため、はるかに優れています。

于 2010-08-04T06:32:51.417 に答える
1

私は最近、モバイルデバイスと通信するための独自のシリアル化スキームを設計しましたが、内部リリースがGoogleprotobufsの公開と一致するようにしました。グーグルのプロトコルがかなり良かったので、それは少しがっかりしました。調べてみることをお勧めします。

たとえば、単純な数字を見てみましょう。JSON、XML、またはCSVを解析するには、すべてASCII番号を解析する必要があります。ASCIIは、バイトあたり約3.3ビットを取得します。protobufはあなたを取得します。7。ASCIIを解析するには、区切り文字を探して計算する必要があります。protobufは少し手を加えるだけです。

もちろん、メッセージをprotobufで直接読み取ることはできません。しかし、ビジュアライザーはすぐに一緒にハッキングされます。大変な作業はすでにGoogleによって行われています。

于 2010-08-04T07:15:33.457 に答える