シリアライゼーションとは何ですか?


8

私は趣味としてプログラミングをしばらくしてきましたが、最近までこの概念を見始めていませんでした。私は「シリアル化とは」を何度もグーグル化してきましたが、実際にはどのような種類の定義も得ていません。通常、その方法の例にすぎません。Ogreフォーラム、Bulletフォーラム、その他すべてのフォーラムで見かけているので、実際にそれがどのようなもので、なぜそれを使用するのかを理解する時期にきていると思います。

編集する

明確にするために、特にゲームプログラミングの意味で、なぜそれを使用するのかをもっと探しています。たとえば、Bullet Physics APIはメッシュのシリアル化について多くのことを話しているので、その理由を理解したいと思います。

ありがとうございました :)

回答:


7

boost.serializationドキュメンテーションから:ここでは、「シリアル化」という用語を使用して、C ++データ構造の任意のセットをバイトのシーケンスに可逆的に分解することを意味します。そのようなシステムは、別のプログラムコンテキストで同等の構造を再構成するために使用できます。コンテキストに応じて、これはオブジェクトの永続化、リモートパラメータの受け渡し、またはその他の機能の実装に使用される場合があります。このシステムでは、「アーカイブ」という用語を使用して、このバイトストリームの特定のレンダリングを指します。これは、バイナリデータ、テキストデータ、XML、またはこのライブラリのユーザーが作成したその他のファイルです。

つまり、シリアル化はメモリ内のオブジェクトをある種のバイトストリームに変換するプロセスであり、逆シリアル化はその逆を行い、バイトストリームを取得してメモリ内のオブジェクトに変換し直します。

「シリアライゼーション」という用語は、バイトストリームのフォーマットについて何も意味しません。効率的にパックされたバイナリ形式、または緩いXMLまたはYAML記述の場合があります。元の言語自体のソースコードである場合もあれば、JavaScriptのサブセットであるJSONなどの別のプログラミング言語である場合もあります。シリアライズされたストリームの正確なフォーマットは、それをどのように使用するかを基にして選択する必要があります。

シリアライゼーションは、JavaPythonなど、多くの言語と環境に組み込まれている機能です。CやC ++などの低レベルの言語では、言語によって提供されるメカニズムは通常十分ではないため、シリアル化ライブラリを使用(または書き込み)する必要があります。ポインターと参照を追跡またはシリアル化できず、エンディアンの問題が発生する可能性があります。例。

ウィキペディアには、シリアライゼーションに関する適切な記事があります。

シリアライゼーションは、ゲーム(およびすべてのソフトウェア)の多くの目的で広く使用されています。

  • リソースファイルからゲーム内のすべての呪文のリストを読み込みます。
  • ゲームの保存と読み込み。
  • 状況(プレーヤーの位置やインベントリなど)をSQLまたはオブジェクトデータベースに記録します。
  • ネットワークまたはその他のIPCリンクを介したリモート関数呼び出しの呼び出し。

6

私が理解しているように、シリアライゼーションは、オブジェクトまたはオブジェクトのセットを取得し、それらをバイトストリームに変換して(データストレージやネットワーク送信などのため)、後でそのバイトストリームから元のオブジェクトを再構築するという概念にすぎません( "逆シリアル化」)。

気まぐれな:スタートレックのテレポーターに少し似ていますが、今はそう思います。

これには多数のライブラリが存在し、それぞれが邪魔になりがちな小さな微妙な問題(バイトストリームのエンディアンなど)を処理します。


これは理にかなっていて、私はテレポーターのアナロジーが本当に好きです、それは間違いなくそれを理解するのに役立ちます笑。ネットワーキングにシリアル化を使用することは完全に理にかなっていますが、Bullet Physicsエンジンや.bullet形式など、他の場所で使用すると、どこで使用されるのかわかりません。
エイダンナイト

私の混乱をさらに明確にするために、私はこの簡単なチュートリアルcodeproject.com/KB/cpp/serialization_primer1.aspxを見つけました。ステップ3では、データをファイルにシリアル化しています。私はそれがちょうどなど、使用してはfopen / fwriteのファイルにテキストを書き込むことから、何が違うのですか理解していない
エイダン・ナイト

シリアライゼーションは、ソフトウェア内のオブジェクトを、fwrite(または他の必要なバイトストリーム指向のリーダー/ライター)に渡すことができるテキストに変換するプロセスです。

3

何かをシリアル化することは、本質的にそれをシリーズに変更することを意味します。ネットワークを介して何かを送信したり、ファイルに書き込んだりする場合は、どちらも一連のバイトを期待するため、これは必要です。したがって、これは一般に、保存およびロードシステムのファンシーな用語です。Bulletの場合は、メッシュデータを取得し、Bulletが効果的に使用できる形式で保存するだけです。メッシュを再分析する必要なく、これを保存して後で読み込むことができます。


0

Serialize / De-serializeは、単にオブジェクトを準備し、ディスクにオブジェクトを書き込んだり、ディスクからオブジェクトに書き込んだりすることです。


-3

私はネットワーキングにシリアル化を使用しています。それ以外はあまり使いません。Bulletでそれが使用されている理由を知りたい場合、回答を得られる可能性が最も高いのはBulletフォーラムで質問するか、ドキュメントを読むことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.