シリアライズ・デシリアライズとは何か?
シリアライズとは何かよくわかっていなかったので、Google先生で調べたり、ChatGPTに聞いたりしたものをまとめてみました。
シリアライズとは
先に結論だけ書いておきます。以下が理解できていればOKだと思います。
- データをビットのままではなく、解釈可能なバイト列に変換すること
- 解釈方法はファイルフォーマットのように明示的に指定するか、ライブラリを使って自動的に解釈させるなどがある
詳細を調べてみる
Wikipediaで調べてみる
Wikipediaを調べてみると、2つの意味があると出てきます。
https://ja.wikipedia.org/wiki/シリアライズ
- コンピュータ実行時の用語として:一つあるいは複数の「コンピュータ資源」(コンピュータ作動時に必要なもの、通常プログラム実行時に要求されるコンピュータリソース。具体例:CPU、メモリ、入出力先など)を、複数の主体(具体例:プログラム)が利用しようとする際、一時点に一つの主体だけが利用するように、順番づけて調整すること。訳語は逐次化。対義語は並列化。
- プログラミング用語として:一つまたは複数のデータ、ファイル、あるいは一つまたは複数のオブジェクトといった、概念的あるいは事実上、複数の別のものとして取り扱っているエンティティを、例えばネットワーク経由で転送する、ストレージに一時格納するなどの目的で、「一つのまとまりとして取り扱う必要」がある場合、「階層をもたないフラットな(直線的な)データ構造に変換する」こと。訳語は直列化。オブジェクト指向プログラミングでは同義語としてマーシャリング (marshalling) がある。対義語はデシリアライズ(訳語は直列化復元)である。
この時点では、何を言っているか全く理解できていないのですが、自分が知りたいのは主に2つ目の言葉の方なので、そちらについてChatGPTに聞いてみます。
ChatGPTに聞いてみた
以下、ChatGPTの回答をまとめたものです。
シリアライズ(Serialize)は、情報技術(IT)のコンテキストで、データやオブジェクトをバイト列に変換するプロセスを指します。
シリアライズの主な目的は、データを永続化することや、異なるプログラムやプラットフォーム間でデータを共有することです。データをシリアライズすることで、そのデータを再び復元する際に、元の状態や構造を保持しながら利用することができます。
異なるプログラミング言語間でのデータのやり取りにおいてもシリアライズが使用されます。例えば、Pythonで作成されたオブジェクトをJavaScriptで処理する場合、PythonのオブジェクトをシリアライズしてJSON形式に変換し、JavaScript側でデシリアライズして使用することが一般的です。
もしもシリアライズを行わない場合、データはそのままの形式で扱われます。具体的には、データの構造やオブジェクトの状態が維持されたまま、そのままの形式でメモリ上に格納されたり、プログラム内で操作されたりします。しかし、データをそのままの形式で扱う場合にはいくつかの制約が生じます。例えば、データをネットワークを通じて別のプログラムやシステムに送信する場合、データの形式が異なる場合には相互に理解できない可能性があります。
シリアライズされていないデータは、コンピュータが直接理解できる形式に変換されずに、0と1のビットの組み合わせとして格納されています。これは、データの元の形式や構造が保持されたままであることを意味します。
データが0と1のビットの形で保存されることは正しいです。他のコンピュータがそれを理解するためには、そのビットの並び方や解釈方法を知る必要があります。
バイト列とは、8ビットのビットの並びであり、それぞれのバイトが特定の意味を持っています。バイト列は、データの形式やフォーマットに応じて構造化され、他のコンピュータがそのデータを解釈する手がかりとなります。他のコンピュータが同じフォーマットや解釈方法を知っている場合、バイト列から元のデータを復元することができます。
一方、単純にビットのままでは、そのビットの並び方や解釈方法が明確ではありません。他のコンピュータがそのビットをどのように解釈すべきかを理解するためには、共通のルールやフォーマットが必要です。そのため、データを他のコンピュータと共有する場合は、ビットをバイト列に変換し、共通のフォーマットや解釈方法を持つバイト列を共有することが重要です。
シリアライズ(データをバイト列に変換する)とデシリアライズ(バイト列を元のデータに戻す)の際には、同じ解釈方法を使用する必要があります。
解釈方法を指定する方法は、主に以下の二つの方法があります。
https://chat.openai.com/share/052d6196-392c-45dc-a407-8f919828c764
- データ形式の指定: データをシリアライズする際に、使用するデータ形式やエンコーディング方法を明示的に指定します。一般的な例としては、JSONやXMLといったデータ形式があります。これらのデータ形式には、データの構造や値のエンコード方法が定義されており、シリアライズおよびデシリアライズの際に同じ形式を指定することで、データを正しく変換できます。
- シリアライズライブラリの使用: プログラミング言語やフレームワークには、シリアライズおよびデシリアライズをサポートする専用のライブラリがあります。これらのライブラリは、データのシリアライズとデシリアライズを処理し、適切な解釈方法を自動的に適用します。シリアライズおよびデシリアライズの手順はライブラリによって異なりますが、通常はライブラリの関数やメソッドを呼び出すことで指定します。
まとめ
はい、ということでまとめると、
- シリアライゼーションは、データをビットのままではなく、バイト列の形式に変換することを指します。データをバイト列に変換することで、他のコンピュータやシステムでも理解できる形式になります。
- シリアライゼーション/デシリアライゼーションの方法は、ファイルフォーマット(例:JSON)に明示的に指定されることもありますし、ライブラリなどが自動的に行うこともあります。
ということでした。
正直、ChatGPTに聞いただけなので、どこまであっているかわかりません。
間違っている箇所があったらご指摘いただけると幸いです。