ネットワークデータ交換の実際の標準はJSON(JavaScriptオブジェクト表記)ですが、短所もあり、場合によっては他の形式がより適用可能になる場合があります。この記事では、使いやすさやパフォーマンスなど、さまざまな選択肢の利点と短所を比較します。
注:この記事では実装の詳細を詳細に紹介しませんが、Rubyプログラマーの場合は、Rubyにいくつかのシリアル化形式を実装する方法を紹介するDhaivatが書いたこの記事をご覧ください。
ウィキペディアの定義によると、シリアル化は
ですデータ構造またはオブジェクト状態を保存できる形式(ファイルまたはメモリバッファーに保存する、またはネットワーク接続リンク上に送信される)に変換し、後で同じまたは他のコンピューター環境で再構築されるプロセス。
名、姓、ニックネーム、生年月日、彼らが演奏する楽器など、人々のグループに関する特定のデータを収集したいとします。スプレッドシートを簡単にセットアップし、いくつかの列を定義し、各行をエントリとして配置できます。さらに一歩進むことができます。出生列の定義日は数字でなければならず、計器列はオプションのリストになります。このように見えます:
当社のWebサイトは、これらのデータ構造を内部ロジックですでに実装しており、スプレッドシート形式を処理できないと仮定しています。これらの問題を解決するために、これらのデータ構造を、さまざまなアプリケーション、アーキテクチャ、またはその他のコンテンツ間で簡単に共有できる形式に変換できます。それらをシリアル化します。これを行うことにより、このデータをプラットフォーム間で転送できるだけでなく、Daserializationと呼ばれる逆プロセスで再構築できるようにすることができます。また、ウェブサイトからスプレッドシートに戻って交換すると、元のオブジェクトのクローンと同じクローン、つまり、最初に送信されたものとまったく同じように見える行が得られます。 要するに、シリアル化データは、さまざまなアプリケーション間で簡単に共有できる一般的な形式を見つけることです。 JSON(JavaScriptオブジェクト表記)は、軽量のデータ交換形式です。人間による読み書きが簡単です。 jsonは最も広く使用されているデータシリアル化形式であり、次の特性があります。
BSON、つまりバイナリJSONは、JSONクラスドキュメントのバイナリコードシリアル化です。また、JSON仕様に属さないデータ型の表現を可能にする拡張機能も含まれています。 jsonは単純なテキスト形式ですが、バイナリデータはテキストにエンコードできますが、これにはいくつかの制限があり、JSONファイルが非常に大きくなります。 BSONは、これらの問題に対処するために使用されます。 次の特性があります
ベンチマークと比較
それにもかかわらず、BSONはMongoDBがデータを保存および表現するために使用する形式であるため、このNOSQLデータベースを使用している場合、それに固執する理由があります。
ただし、特にJSON仕様と比較して、YAML仕様は非常に大きいです。しかし、より多くのデータ型と機能が含まれているため、言わなければなりません。
JSONとYAMLはどちらもデータシリアル化形式ですが、いくつかの重要な違いがあります。 JSONはJavaScriptのサブセットであり、JavaScriptとの互換性のためにWebアプリケーションでよく使用されます。シンプルな構文を使用しており、読み書きが簡単です。ただし、コメントやマルチライン文字列などのいくつかの機能がありません。一方、YamlはJSONのスーパーセットであり、より人間化された構文を持っています。コメントとマルチライン文字列をサポートしているため、構成ファイルとして使いやすくなります。ただし、JSONよりも複雑で、JSONほど広くサポートされていません。 BSONまたはバイナリJSONは、JSONクラスドキュメントのバイナリ表現です。空間で効率的になるように設計されており、ネットワーク伝送などの計算集約型シナリオにも当てはまります。 BSONは、バイナリデータ型や日付データ型など、JSONよりも多くのデータ型を保存できます。ただし、JSONやYAMLほど読み取れないものではなく、主にMongoDBのデータを保存および取得するために使用されます。 メッセージパックは、JSONのようなが、より効率的なバイナリシリアル化形式です。コンパクトで高速で、さまざまなデータ型をサポートしています。リアルタイムストリーミングアプリケーションなど、高性能を必要とするアプリケーションでよく使用されます。ただし、BSONのように、JSONやYAMLほど読み取ることはできません。 はい、XML、Protobuf、Avroなど、JSONには他にもいくつかの選択肢があります。 XMLは、複雑なデータ構造をサポートする人間が読みやすいマークアップ言語ですが、JSONよりも冗長です。 ProtobufまたはProtocol Buffersは、Googleが開発したバイナリシリアル化形式であり、コンパクトで高速ですが、読み取り可能ではありません。 Avroは、Apacheによって開発されたバイナリシリアル化形式で、パターンの進化をサポートして長期のデータストレージに適しています。 データシリアル化形式の選択は、特定のニーズに依存します。読みやすく使いやすい形式が必要な場合は、JSONまたはYAMLが最良の選択かもしれません。コンパクトで高速な形式が必要な場合は、MessagePackまたはBSONがより適切になる場合があります。パターンの進化をサポートする形式が必要な場合、Avroはおそらく最良の選択です。決定を下す前に、各形式の長所と短所を理解することが重要です。 はい、同じアプリケーションで複数のデータシリアル化形式を使用できます。たとえば、JSONを使用してクライアントとサーバー間のデータを交換し、BSONを使用してMongoDBにデータを保存できます。ただし、複数の形式を使用すると、アプリケーションの複雑さが増す可能性があるため、長所と短所を慎重に計量してください。 さまざまなシリアル化形式間でデータを変換するために使用できるライブラリとツールがいくつかあります。たとえば、PythonのJSONモジュールを使用してJSONオブジェクトとPythonオブジェクト間でデータを変換するか、YAMLモジュールを使用してYAMLオブジェクトとPythonオブジェクト間でデータを変換できます。 JSON2YAMLなどのオンラインツールもあります。これは、JSONとYAML間のデータを変換するために使用できます。 異なるデータシリアル化形式を使用することのパフォーマンスへの影響は、ユースケースによって異なる場合があります。 BSONやMessagePackなどのバイナリ形式は、JSONやYAMLなどのテキストベースの形式よりも高速かつコンパクトです。ただし、それらは人間よりも読みやすく、デバッグがより困難になる可能性があります。データのシリアル化と脱整化に使用されるライブラリとツールのパフォーマンスも考慮する必要があります。 はい、データシリアル化形式を使用する場合、安全上の注意事項があります。たとえば、JSONやYAMLなどの一部のフォーマットが正しくクリーニングされていない場合、任意のコードを実行でき、セキュリティの脆弱性につながる可能性があります。信頼できるライブラリとツールを使用して、データをシリアル化および脱着し、ユーザーが提供するデータをクリーンアップしてください。 データのシリアル化形式の詳細については、オンラインで多くのリソースがあります。通常、チュートリアルと例を含む各形式で公式ドキュメントを読むことから始めることができます。また、スタックオーバーフローやメディアなどのサイトに関する多くのチュートリアルや記事もあります。最後に、独自のプロジェクトでさまざまなフォーマットを試して、実践的な体験を得ることができます。 name
ショートネーム
誕生日多かれ少なかれ、スプレッドシート形式のみが必要な場合は、データ構造を定義します。問題は、この情報をデータベースまたはWebサイトと交換する場合、これらの他のプラットフォーム上のこれらのデータ構造の実装メカニズムは、一般的に同じであっても非常に異なることです。アプリケーションがこのために特別に設計されていない限り、スプレッドシートをWebアプリケーションに挿入することはできません。何らかのエクスポートツールまたはゲートウェイがない限り、Webサイトからデータベースに情報を転送することはできません。
フォーマット
json
(ほとんど)人間読み取り可能なコード:コードがぼやけたり絞り込まれたりしたとしても、Jsonlintなどのツールを使用して、いつでもインデントして再び読みやすくすることができます。
bson 番号
以下は、JSONでのシリアル化後の以前のスプレッドシートがどのようになっているかです。
<code>[
{
"name": "William",
"last name": "Bailey",
"dob": 1962,
"nickname": "Axl Rose",
"instruments": [
"vocals",
"piano"
]
},
{
"name": "Saul",
"last name": "Hudson",
"dob": 1965,
"nickname": "Slash",
"instruments": [
"guitar"
]
}
]
</code>
便利なバイナリ情報ストレージ:画像やアクセサリーを交換するのに適しています
messagepack 二重精度(64ビットIEEE 754フローティングポイント番号)
JSONに似ています。しかし、より速くて小さく。
メッセージパック(MSGPackとも呼ばれます)は、シリアル化の別のバイナリ形式です。 BSONほど有名ではありませんが、見る価値があります。
yaml:yamlはマークアップ言語ではありません。それが何であるか:YAMLは、すべてのプログラミング言語の人間化データシリアル化標準です。
プロトコルバッファー(プロトブフ、バイナリ形式)など、他にも多くのシリアル化形式があります(かなりランダムな方法で)省略しました。すべての可能な形式のみを知りたい場合は、データのシリアル化形式の比較に関するWikipediaをご覧ください。 コレクション:
その他の形式順序付けされていないキーセット(!!マップ)
null値(〜、null)
以下は、YAMLでのシリアル化後のスプレッドシートの様子です。
<code>[
{
"name": "William",
"last name": "Bailey",
"dob": 1962,
"nickname": "Axl Rose",
"instruments": [
"vocals",
"piano"
]
},
{
"name": "Saul",
"last name": "Hudson",
"dob": 1965,
"nickname": "Slash",
"instruments": [
"guitar"
]
}
]
</code>
このエピソードを終了するために、BSONやMessagePackなどのバイナリ形式を使用して多くの情報を保存/交換する場合は、HDF5をチェックするように誘惑されるかもしれないことに注意してください。
表示されるパターンは、BSONがJSONよりもシリアル化されると高価である可能性がありますが、操作の両方よりも速いです。さらに、BSONファイルは、バイナリ形式であるにもかかわらず、オーバーヘッドのために非バイナリデータを保存する場合、JSONファイルよりも大きくなる場合があります。参照するいくつかのリンク:
また、同じ形式でさえ、パフォーマンスが選択したシリアナーとパーサーに依存する可能性があることも注目に値します。
馬鹿げたように聞こえますが、Bsonには名前の利点があります。人々は自動的にMongodbで開発された形式(BSON)を標準(JSON)に関連付けます。それらの間には関係がありません。したがって、JSONのバイナリ代替品を検索する際には、他のオプションも検討できます。 データのシリアル化とJSONの代替案に関するよくある質問
JSONとYAMLの主な違いは何ですか?
BSONはJSONとYAMLと比較してどうですか?
メッセージパックとは何ですか?また、他のデータシリアル化形式と比較してどうですか?
JSONの他の選択肢は何ですか?
どのデータシリアル化形式を使用する必要がありますか?
同じアプリケーションで複数のデータシリアル化形式を使用できますか?
異なるシリアル化形式間でデータを変換する方法は?
さまざまなデータシリアル化形式を使用することにより、どのようなパフォーマンスへの影響が生じますか?
データシリアル化形式を使用する際の安全上の注意事項は何ですか?
データのシリアル化形式の詳細についてはどうすればよいですか?
以上がデータシリアル化比較:JSON、YAML、BSON、MessagePackの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。