ホームページ > テクノロジー周辺機器 > IT業界 > データシリアル化比較:JSON、YAML、BSON、MessagePack

データシリアル化比較:JSON、YAML、BSON、MessagePack

William Shakespeare
リリース: 2025-02-18 12:57:09
オリジナル
911 人が閲覧しました

Data Serialization Comparison: JSON, YAML, BSON, MessagePack

Data Serialization Comparison: JSON, YAML, BSON, MessagePack

ネットワークデータ交換の実際の標準はJSON(JavaScriptオブジェクト表記)ですが、短所もあり、場合によっては他の形式がより適用可能になる場合があります。この記事では、使いやすさやパフォーマンスなど、さまざまな選択肢の利点と短所を比較します。

注:この記事では実装の詳細を詳細に紹介しませんが、Rubyプログラマーの場合は、Rubyにいくつかのシリアル化形式を実装する方法を紹介するDhaivatが書いたこの記事をご覧ください。

キーポイント

  • JSON(JavaScriptオブジェクト表記)は、データのシリアル化に最も広く使用されている形式であり、人間が読めるコード、簡単な仕様、広範なサポートを提供します。ただし、特にバイナリデータをエンコードする場合は、いくつかの制限もあります。
  • BSON(バイナリJSON)は、JSONクラスドキュメントのバイナリコードシリアル化です。便利なバイナリ情報ストレージを提供し、高速メモリ操作用に設計されており、MongoDBの主なデータ表現です。ただし、シリアル化する場合、JSONよりも高価になる場合があります。
  • メッセージパックは、効率的なネットワーク伝送を可能にするように設計されたシリアル化のバイナリ形式です。通常、速度とサイズの点でBSONを上回り、JSONの互換性を高めます。
  • YAML(YAMLはマークアップ言語ではありません)は、人間が読めるコードとコンパクトコードを提供するシリアル化のためのプレーンテキスト形式です。データ構造の表示と編集に特に適しています。ただし、その仕様はJSONの仕様よりもはるかに大きく、したがってより複雑です。

データシリアル化とは

ウィキペディアの定義によると、シリアル化は

です

データ構造またはオブジェクト状態を保存できる形式(ファイルまたはメモリバッファーに保存する、またはネットワーク接続リンク上に送信される)に変換し、後で同じまたは他のコンピューター環境で再構築されるプロセス。

名、姓、ニックネーム、生年月日、彼らが演奏する楽器など、人々のグループに関する特定のデータを収集したいとします。スプレッドシートを簡単にセットアップし、いくつかの列を定義し、各行をエントリとして配置できます。さらに一歩進むことができます。出生列の定義日は数字でなければならず、計器列はオプションのリストになります。このように見えます:

name ショートネーム 誕生日多かれ少なかれ、スプレッドシート形式のみが必要な場合は、データ構造を定義します。問題は、この情報をデータベースまたはWebサイトと交換する場合、これらの他のプラットフォーム上のこれらのデータ構造の実装メカニズムは、一般的に同じであっても非常に異なることです。アプリケーションがこのために特別に設計されていない限り、スプレッドシートをWebアプリケーションに挿入することはできません。何らかのエクスポートツールまたはゲートウェイがない限り、Webサイトからデータベースに情報を転送することはできません。

当社のWebサイトは、これらのデータ構造を内部ロジックですでに実装しており、スプレッドシート形式を処理できないと仮定しています。これらの問題を解決するために、これらのデータ構造を、さまざまなアプリケーション、アーキテクチャ、またはその他のコンテンツ間で簡単に共有できる形式に変換できます。それらをシリアル化します。これを行うことにより、このデータをプラットフォーム間で転送できるだけでなく、Daserializationと呼ばれる逆プロセスで再構築できるようにすることができます。また、ウェブサイトからスプレッドシートに戻って交換すると、元のオブジェクトのクローンと同じクローン、つまり、最初に送信されたものとまったく同じように見える行が得られます。

要するに、シリアル化データは、さまざまなアプリケーション間で簡単に共有できる一般的な形式を見つけることです。

フォーマット

json

Data Serialization Comparison: JSON, YAML, BSON, MessagePack

JSON(JavaScriptオブジェクト表記)は、軽量のデータ交換形式です。人間による読み書きが簡単です。

jsonは最も広く使用されているデータシリアル化形式であり、次の特性があります。

    (ほとんど)人間読み取り可能なコード:コードがぼやけたり絞り込まれたりしたとしても、Jsonlintなどのツールを使用して、いつでもインデントして再び読みやすくすることができます。
  • 非常にシンプルで簡単な仕様:仕様全体の概要は、ページに配置できます(JSON Webサイトに示されています)。
  • 幅広いサポート:すべてのプログラミング言語またはIDEにはJSONサポートが付属しているだけでなく、多くのWebサービスAPIがデータを交換する方法としてJSONも提供します。
  • JavaScriptのサブセットとして、次のJavaScriptデータ型をサポートしています。
  • 文字列
    • 番号
    • オブジェクト
    • array
    • true and false
    • null
    以下は、JSONでのシリアル化後の以前のスプレッドシートがどのようになっているかです。
bson

<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、つまりバイナリJSONは、JSONクラスドキュメントのバイナリコードシリアル化です。また、JSON仕様に属さないデータ型の表現を可能にする拡張機能も含まれています。 Data Serialization Comparison: JSON, YAML, BSON, MessagePack

jsonは単純なテキスト形式ですが、バイナリデータはテキストにエンコードできますが、これにはいくつかの制限があり、JSONファイルが非常に大きくなります。 BSONは、これらの問題に対処するために使用されます。

次の特性があります

    便利なバイナリ情報ストレージ:画像やアクセサリーを交換するのに適しています
  • 速いメモリ操作を実行することを目指してください
  • 簡単な仕様:JSONと同様に、BSONには非常に短くシンプルな仕様もあります
  • mongodbの主なデータ表現:bsonは、簡単に横断できるように設計されています
  • 追加のデータ型:
    • 二重精度(64ビットIEEE 754フローティングポイント番号)
    • 日付(UNIX時代以降のミリ秒)
    • BYTE ARRAY(バイナリデータ)
    • bsonオブジェクトとbsonアレイ
    • javaScriptコード
    • md5バイナリデータ
    • 正規表現
messagepack

Data Serialization Comparison: JSON, YAML, BSON, MessagePack

JSONに似ています。しかし、より速くて小さく。

メッセージパック(MSGPackとも呼ばれます)は、シリアル化の別のバイナリ形式です。 BSONほど有名ではありませんが、見る価値があります。

その特性には次のものが含まれます

効率的なネットワーク伝送を達成することを目指しています
  • bsonよりも優れたjsonの互換性:uruhashiがこのスタックオーバーフロー投稿で説明しているように
  • BSONよりも小さい:BSONよりもオーバーヘッドが小さく、ほとんどの場合、より小さなオブジェクトをシリアル化できます
  • タイプチェック:静的タイピングをサポートしています
  • Stream API:Stream Deserializerをサポートします。これは、ネットワーク通信に非常に役立ちます。
  • yaml

yaml:yamlはマークアップ言語ではありません。それが何であるか:YAMLは、すべてのプログラミング言語の人間化データシリアル化標準です。

プレーンテキスト形式に戻ると、YAMLはJSONの代替品です:
  • (本当に)人間の読み取り可能なコード:YAMLは非常に読みやすいため、ホームページのコンテンツでさえYAMLで表示され、この点を説明します
  • 完全なコード:スペースインデンテーションを使用して、引用符または括弧なしの構造を表す
  • リレーショナルデータの構文:アンカー(&)とエイリアスを使用して内部参照を許可する(*)
  • データ構造の表示/編集に特に適しています:構成ファイル、デバッグ中のダンプ、ドキュメントタイトル
  • 言語に依存する豊富なセットのセット:
    • コレクション:
      • 順序付けされていないキーセット(!!マップ)
      • 注文キーのシーケンス(!! omap)
      • 注文キーのシーケンス(!!ペア)
      • 不平等値の順序付けられていないセット(!! set)
      • 任意の値のシーケンス(!! seq)
      • スカラータイプ:
      null値(〜、null)
    • 10進(1234)、16進数(0x4d2)およびoctal(02333)整数
      • 固定(1_230.15)およびインデックス(12.3015e 02)フローティングポイント番号
      • Infinity(.inf、-.inf)および非数量(.nan)
      • true(y、true、yes、on)and false(n、false、no、off)
      • Base64(!!バイナリ)
      • を使用してエンコードされたバイナリ
      • タイムスタンプ(!!タイムスタンプ)。
      以下は、YAMLでのシリアル化後のスプレッドシートの様子です。
    その他の形式
プロトコルバッファー(プロトブフ、バイナリ形式)など、他にも多くのシリアル化形式があります(かなりランダムな方法で)省略しました。すべての可能な形式のみを知りたい場合は、データのシリアル化形式の比較に関するWikipediaをご覧ください。

…hdf5?
<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>
ログイン後にコピー
ログイン後にコピー

ここでトピックから少し逸脱します。階層化されたデータ形式バージョン5(HDF5)は、実際にはシリアル化用ではなく、保管用であり、データサイエンスやその他の業界を席巻しています。これは非常に高速で普遍的な形式であり、多くのデータ構造を保存するだけでなく、リレーショナルデータベースの代替としても使用できます。

このエピソードを終了するために、BSONやMessagePackなどのバイナリ形式を使用して多くの情報を保存/交換する場合は、HDF5をチェックするように誘惑されるかもしれないことに注意してください。

ベンチマークと比較Data Serialization Comparison: JSON, YAML, BSON, MessagePack 表示されるパターンは、BSONがJSONよりもシリアル化されると高価である可能性がありますが、操作の両方よりも速いです。さらに、BSONファイルは、バイナリ形式であるにもかかわらず、オーバーヘッドのために非バイナリデータを保存する場合、JSONファイルよりも大きくなる場合があります。参照するいくつかのリンク:

  • dev(c#/。net)のm@xでのマキシムnovakのシリアル化パフォーマンス比較。
  • IVITA.comでIlya Grigorikが発行した、
  • プロトコルバッファー、Avro、Thrift、およびMessagePack。
  • 原子オブジェクト上のバイナリシリアル化に関するKarlin Foxのガイド。
  • Matthew Rocklinによって書かれた無料のストレージPandasデータフレーム。
  • Wesley TanakaによるMessagePack vs. Json vs. Bsonの比較。
また、同じ形式でさえ、パフォーマンスが選択したシリアナーとパーサーに依存する可能性があることも注目に値します。

メモとコメント

馬鹿げたように聞こえますが、Bsonには名前の利点があります。人々は自動的にMongodbで開発された形式(BSON)を標準(JSON)に関連付けます。それらの間には関係がありません。したがって、JSONのバイナリ代替品を検索する際には、他のオプションも検討できます。

実際、メッセージパックはあらゆる点でBSONを上回るようです。それはより速く、より小さく、BSONよりもJSON互換性があります。 (実際、既にJSONを使用している場合、MessagePackはほぼプラグアンドプレイの最適化です。)多分「レポーター」として、私はもう少しバランスが取れているはずですが、開発者としてはそれについて疑いの余地はありません。

それにもかかわらず、BSONはMongoDBがデータを保存および表現するために使用する形式であるため、このNOSQLデータベースを使用している場合、それに固執する理由があります。

もちろん、シリアル化はバイナリデータを保存することだけではありません。確かに、JSONには別の目標があります。しかし、少し注意が払われていると、Yamlがこの点でより良くなっていることが明らかになります。

ただし、特にJSON仕様と比較して、YAML仕様は非常に大きいです。しかし、より多くのデータ型と機能が含まれているため、言わなければなりません。

一方、JSONのシンプルさが他のシリアル化形式としての採用の鍵であることは無視することはできません。既に存在する広く使用されている言語、JavaScriptに依存しており、JSに知っているか、またはJSにさらされている場合は(Web開発業界にいる場合は、JSONについて知っているでしょう)。

では、今すぐYAMLを使用してみませんか?多くの場合、これは簡単ではありません。 JSONは、JSONコードをHTTPリクエストに簡単に埋め込むことができるため、Web APIの場所をまだ持っています(get、for urls、およびformsなどの投稿など):この形式では、転送が突然中断されるかどうかを知ることができます。 、コードが自動的に無効になるため、YAMLやその他の競合するプレーンテキスト形式には当てはまらない可能性があります。さらに、ある時点でJSONベースのAPIおよびレガシーコードと対話する必要があり、同じ目的(データシリアル化)のために2つのコード(JSONおよびYAMLメソッド)を維持することは常に痛いことです。

しかし、再び、これらの部分は、私たちを後ろに押し進め、より新しい、より効率的な技術を採用することを妨げる議論と同じです(例:Python 2の代わりにPython 3)。私たちはかつて私たちのプログラマーや起業家がイノベーターであると思っていましたよね?

データのシリアル化とJSONの代替案に関するよくある質問

JSONとYAMLの主な違いは何ですか?

JSONとYAMLはどちらもデータシリアル化形式ですが、いくつかの重要な違いがあります。 JSONはJavaScriptのサブセットであり、JavaScriptとの互換性のためにWebアプリケーションでよく使用されます。シンプルな構文を使用しており、読み書きが簡単です。ただし、コメントやマルチライン文字列などのいくつかの機能がありません。一方、YamlはJSONのスーパーセットであり、より人間化された構文を持っています。コメントとマルチライン文字列をサポートしているため、構成ファイルとして使いやすくなります。ただし、JSONよりも複雑で、JSONほど広くサポートされていません。

BSONはJSONとYAMLと比較してどうですか?

BSONまたはバイナリJSONは、JSONクラスドキュメントのバイナリ表現です。空間で効率的になるように設計されており、ネットワーク伝送などの計算集約型シナリオにも当てはまります。 BSONは、バイナリデータ型や日付データ型など、JSONよりも多くのデータ型を保存できます。ただし、JSONやYAMLほど読み取れないものではなく、主にMongoDBのデータを保存および取得するために使用されます。

メッセージパックとは何ですか?また、他のデータシリアル化形式と比較してどうですか?

メッセージパックは、JSONのようなが、より効率的なバイナリシリアル化形式です。コンパクトで高速で、さまざまなデータ型をサポートしています。リアルタイムストリーミングアプリケーションなど、高性能を必要とするアプリケーションでよく使用されます。ただし、BSONのように、JSONやYAMLほど読み取ることはできません。

JSONの他の選択肢は何ですか?

はい、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などの一部のフォーマットが正しくクリーニングされていない場合、任意のコードを実行でき、セキュリティの脆弱性につながる可能性があります。信頼できるライブラリとツールを使用して、データをシリアル化および脱着し、ユーザーが提供するデータをクリーンアップしてください。

データのシリアル化形式の詳細についてはどうすればよいですか?

データのシリアル化形式の詳細については、オンラインで多くのリソースがあります。通常、チュートリアルと例を含む各形式で公式ドキュメントを読むことから始めることができます。また、スタックオーバーフローやメディアなどのサイトに関する多くのチュートリアルや記事もあります。最後に、独自のプロジェクトでさまざまなフォーマットを試して、実践的な体験を得ることができます。

以上がデータシリアル化比較:JSON、YAML、BSON、MessagePackの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート