18

堅牢で拡張可能なファイルIOが必要になる新しいソフトウェアの作業を開始しています。そこにはたくさんのフォーマットがあります。XML、JSON、INIなど。ただし、常にプラスとマイナスがあるので、コミュニティからの意見を求めたいと思いました。

大まかな要件は次のとおりです。

  1. 形式は「標準」です...必要がなければ、車輪の再発明はしたくありません。正式なIEEE標準である必要はありませんが、Googleで新しいユーザーとして情報を入手できるものには、vi以外のサポートツール(エディター)がある場合があります。(ただし、ソフトウェアユーザーは通常、コンピューターに精通しており、viを使用して満足しています。)
  2. C++と簡単に統合できます。100MBのライブラリと3つの異なるコンパイラを使用して、ライブラリを起動して実行する必要はありません。
  3. 表形式の入力をサポート(2次元、n次元)
  4. PODタイプをサポート
  5. より多くの入力が必要になったときに拡張でき、変数にうまくバインドできます。
  6. 解析速度はそれほど重要ではありません
  7. 理想的には、読むのと同じくらい簡単に書く(反映する)ことができます
  8. WindowsとLinuxでうまく機能します
  9. 合成をサポートします(1つのファイルが別のファイルを参照して読み取るなど)。
  10. 人間が読める形式

完璧な世界では、ヘッダーのみのライブラリまたはクリーンなSTL実装を使用しますが、うまく機能する場合は、Boostまたはいくつかの小さな外部ライブラリを利用しても問題ありません。

では、さまざまなフォーマットについてどう思いますか?欠点?利点は?

編集

考慮すべきオプション?他に追加するものはありますか?

  • XML
  • YAML
  • SQLite
  • Googleプロトコルバッファ
  • シリアル化のブースト
  • INI
  • JSON
4

4 に答える 4

18

すべての基準を満たす優れたフォーマットが1つあります。

SQLite!

アプリケーションファイル形式としてのSQLiteの使用に関する記事をお読みください。また、このトピックについては、D。Richard Hipp(SQLiteの作成者)によるGoogleTechTalkをご覧ください。

それでは、SQLiteがどのように要件を満たしているかを見てみましょう。

フォーマットは「標準」です

SQLiteは、ほとんどのモバイル環境、および多くのデスクトップアプリ(Firefox、Thunderbird、Google Chrome、Adobe Readerなど)で選択される形式になっています。

C++と簡単に統合できます

SQLiteには標準のCインターフェースがあり、これは1つのソースファイルと1つのヘッダーファイルのみです。C++ラッパーもあります。

表形式の入力をサポート(2次元、n次元)

SQLiteテーブルは想像できる限り表形式です。たとえば3次元データを表すには、列x,y,z,valueを含むテーブルを作成し、次のようにデータを行のセットとして保存します。

x1,y1,z1,value1
x2,y2,z2,value2
...

PODタイプをサポート

PODとは、プレーンオールドデータまたはBLOBを意味していると思います。SQLiteを使用すると、BLOBフィールドをそのまま保存できます。

より多くの入力が必要になると拡張でき、変数にうまくバインドします

これが本当に輝いているところです。

解析速度はそれほど重要ではありません

しかし、SQLiteの速度は素晴らしいです。実際、解析は基本的に透過的です。

理想的には、読むのと同じくらい簡単に書く(反映する)ことができます

INSERT書き込みと読み取りに使用するだけSELECTです-何が簡単でしょうか?

WindowsとLinuxでうまく機能します

あなたは賭けます、そして他のすべてのプラットフォームも同様です。

合成をサポートします(1つのファイルが別のファイルを参照して読み取る)

あるデータベースを別のデータベースにアタッチできます。

人間が読める形式

バイナリではありませんが、そこには多くの優れたSQLiteブラウザ/エディタがあります。私はWindowsのSQLiteExpertPersonalとLinuxのsqlitemanが好きです。Firefox用のSQLiteエディタープラグインもあります。


SQLiteが無料で提供する他の利点があります:

  • データは索引付け可能であるため、検索が非常に高速になります。XML、JSON、またはその他のテキストのみの形式を使用してこれを行うことはできません。

  • データ量が非常に多い場合でも、部分的に編集することができます。1つの値を編集するためだけに、数ギガバイトを書き直す必要はありません。

  • SQLiteは完全にトランザクション型です:データが常に一貫していることを保証します。アプリケーション(またはコンピューター全体)がクラッシュした場合でも、データベースへの最初の接続試行時に、データは最後の既知の整合性のある状態に自動的に復元されます。

  • SQLiteはデータを逐語的に保存します:データ内のジャンク文字(文字列に埋め込まれたゼロバイトを含む)をエスケープすることを心配する必要はありません-常にプリペアドステートメントを使用するだけで、データを透過的にすることができます。これは、テキストデータ形式、特にXMLを扱う場合、大きくて厄介な問題になる可能性があります。

  • SQLiteはすべての文字列をUnicodeで保存します:(UTF-8デフォルト)またはUTF-16。つまり、テキストエンコーディングやデータ形式の国際的なサポートについて心配する必要はありません。

  • SQLiteを使用すると、データを小さなチャンク(実際には行ごと)で処理できるため、メモリが少ない状態でもうまく機能します。多くの場合、テキストを解析するためにすべてのテキストをメモリにロードする必要があるため、これはテキストベースの形式では問題になる可能性があります。確かに、効率的なストリームベースのXMLパーサーはほとんどありませんが、一般に、どのXMLパーサーもSQLiteと比較してかなりメモリに貪欲です。

于 2013-02-05T04:27:39.103 に答える
8

XMLとjsonの両方でかなりの作業を行ってきたので、拡張可能なシリアル化形式としての両方についての私の主観的な意見を次に示します。

  • 形式は「標準」です:両方ともはい
  • C++と簡単に統合できます。どちらも可能です。いずれの場合も、おそらくそれを処理するための何らかのライブラリが必要になります。Linuxでは、libxml2が標準であり、libxml++はそのC++ラッパーです。ディストリビューションのパッケージマネージャーから両方を取得できるはずです。それらをWindowsで動作させるには、少し手間がかかります。Boost for jsonにはある程度のサポートがあるようですが、私はそれを使用していません。私は常にライブラリを使用してjsonを扱ってきました。本当に、図書館のルートはどちらにとってもそれほど面倒ではありません。
  • 表形式の入力をサポート(2次元、n次元):両方ともはい
  • PODタイプをサポート:両方ともはい
  • より多くの入力が必要になると拡張できます:両方ともそうです-それは両方にとって大きな利点の1つです。
  • 変数にうまくバインドする:「このデータは、私のプログラムでこの変数に自動的に逆シリアル化する必要があります」という意味がファイル自体の内部にある場合は、両方ともそうではありません。
  • 読むのと同じくらい簡単に書く(反映する):使用するライブラリによって異なりますが、私の経験では両方ともそうです。(実際には、printf()を使用してjsonを作成するという許容できる仕事をすることができます。)
  • WindowsとLinuxでうまく機能します:両方ともそうです、そしてそのことについてはMacOSXと同じです。
  • 読み取るために別のファイルを参照する1つのファイルをサポートします。C#includeに似たものを意味する場合、XMLにはこれを実行する機能があります(ドキュメントエンティティなど)が、jsonにはありません。
  • 人間が読める形式:どちらも通常UTF-8で記述されており、改行とインデントが許可されているため、人間が読める形式にすることができます。ただし、私は479 KBのXMLファイルをすべて1行で処理しているので、それを理解するためにプリティプリンターで実行する必要がありました。jsonもかなり読めない場合がありますが、私の経験では、XMLよりも適切にフォーマットされていることがよくあります。

新しいプロジェクトを開始するとき、私は一般的にjsonを好みます。よりコンパクトで人間が読める形式になっています。jsonではなくXMLを選択する主な理由は、XMLは自動化されたドキュメント形式の検証をサポートしているのに対し、jsonを使用して独自の検証コードを作成する必要があるため、不正な形式のドキュメントを受け取ることを心配している場合です。

于 2013-02-05T05:18:13.037 に答える
4

グーグルバッファをチェックしてください。これにより、ほとんどの要件が処理されます。

彼らのドキュメントから、高レベルのステップは次のとおりです。

.protoファイルでメッセージ形式を定義します。
プロトコルバッファコンパイラを使用します。
C ++プロトコルバッファAPIを使用して、メッセージの書き込みと読み取りを行います。

于 2013-02-05T04:27:01.847 に答える
-6

私の目的では、行く方法はXMLだと思います。

  1. この形式は標準ですが、プログラム要件の変化に応じてスキーマを変更および柔軟に変更できます。
  2. いくつかのライブラリオプションがあります。大きいもの(Xerces-C)もあれば小さいもの(ezxml)もありますが、多くのオプションがあるため、単一のプロバイダーや非常に具体的なソリューションに縛られることはありません。
  3. 表形式の入力(2d、n次元)をサポートできます。これには、「私たちの」側でより多くの解析作業が必要であり、XMLの最も弱い点である可能性があります。
  4. PODタイプをサポートします:もちろんです。
  5. より多くの入力が必要になると拡張でき、スキーマの変更やパーサーの変更を通じて変数などに適切にバインドできます。
  6. 解析速度はそれほど重要ではないため、1つまたは複数のテキストファイルの処理は問題になりません。
  7. XMLは、プログラムで読み取るのと同じくらい簡単に書くことができます。
  8. WindowsとLinux、またはCファイルとテキストファイルをサポートするその他のOSでうまく機能します。
  9. 合成をサポートします(1つのファイルが別のファイルを参照して読み取るなど)。
  10. すぐに使用できる構文の強調表示をサポートする多くのテキストエディタ(Sublime、viなど)を備えた人間が読める形式。多くのWebブラウザはデータを適切に表示します。

すべての素晴らしいフィードバックをありがとう!純粋なバイナリソリューション、Protocol Buffers、またはboost :: serializationが必要な場合は、おそらく私たちが行う方法だと思います。

于 2013-02-08T19:25:44.493 に答える