web-dev-qa-db-ja.com

データのシリアル化とは何ですか?

まず第一に、PHPマニュアルの WikiPedia または serialize 関数からも明確な定義を得ることができませんでした。シリアライゼーションという用語が必要な場合と、それがないとどうなるかを知る必要がありますか?言い換えると、シリアル化が必要な場所では、シリアル化がなければ重要な機能が失われます。

31
user1350140

シリアル化とは?

シリアル化は、他の言語にエンコードするオブジェクトです。たとえば、PHPのような配列があります:

$array = array("a" => 1, "b" => 2, "c" => array("a" => 1, "b" => 2));

そして、ファイルに保存するか、他のアプリケーションに送信します。

言語には複数の選択肢がありますが、考え方は同じです。その配列をテキストまたはバイトにエンコード(または翻訳)し、ファイルに書き込んだり、ネットワーク経由で送信したりする必要があります。たとえば、あなたが

$data = serialize($array);

あなたはこれを取得します:

a:3:{s:1:"a";i:1;s:1:"b";i:2;s:1:"c";a:2:{s:1:"a";i:1;s:1:"b";i:2;}}

これはPHPが理解し、その逆も機能するため、オブジェクトをデシリアライズするために使用できます。たとえば、配列をファイルに保存し、それを元に戻したい場合コード:

$array = unserialize($data);

ただし、別のシリアル化形式、たとえばJSONを選択することもできます。

$json = json_encode($array);

あなたにこれを与えます:

{"a":1,"b":2,"c":{"a":1,"b":2}}

簡単に保存したり、人間の目で読み取ったり、ネットワーク経由で送信したりするだけでなく、他のほぼすべての言語(Javascript、Java、C#、C++ .....)で理解できる結果

結論シリアル化は、データを保存または共有する場合の、他の言語へのオブジェクト翻訳です。

何もできないが、シリアル化するような状況はありますか?

いいえ。ただし、通常、シリアル化は物事を簡単にします。

JSONとPHPは唯一の可能な形式をフォーマットしますか?いいえ、いいえ、いいえ、もう1回いいえ。多くの形式があります。

  • SOAP、WSDLなどの後継者がいるXML(特定の目的がある)
  • バイト
  • ...
  • ...
  • ...
  • 独自の形式(シリアル化用に独自の形式を作成して使用できますが、それは大したことであり、ほとんどの場合価値がありません)

私が助けたことを願っています!

77

シリアル化とは、メモリ内のオブジェクトを別の形式に変換して、ファイルに保存したり、ネットワーク経由で送信したりするプロセスです。逆シリアル化は逆のプロセスで、実際のオブジェクトインスタンスは、オブジェクトの指定されたシリアル化された表現から復元されます。これは、さまざまなシステム間で通信するときに非常に便利です。

シリアル化形式は、interoperableまたはnon-interoperableのいずれかです。相互運用可能な形式(JSON、XMLなど)を使用すると、特定のプラットフォームを使用してオブジェクトをシリアル化し、別のプラットフォームを使用してオブジェクトを逆シリアル化できます。たとえば、JSONを使用すると、javascriptを使用してオブジェクトをシリアル化し、ネットワーク経由でオブジェクトをシリアル化解除して使用するPHPスクリプトに送信できます。

serialize() PHP関数は、相互運用不可能な形式を使用します。つまり、PHPのみを使用して、オブジェクトのシリアル化と逆シリアル化の両方を行うことができます。

JSON相互運用可能形式を使用してPHPオブジェクトをシリアライズ/デシリアライズするために、 json_encode および json_decode() 関数を使用できます。

16
Darin Dimitrov

シリアル化は、データ(変数など)を文字列などの表現に変換するプロセスであり、ファイルやデータベースなどから簡単に読み書きできます。

ユースケース?多数ありますが、一般的には、ネストされた複雑な配列またはオブジェクトを取得し、それを保存して後で同じ構造を取得するために読み取ることができる単純な文字列に変換するというアイデアを中心に展開します。たとえば、phpにある場合:

$blub = array();
$blub['a'] = 1;
$blub['a']['b'] = 4;
$blub['b'] = 27;
$blub['b']['b'] = 46;

すべての配列メンバーを個別に調べて記述する代わりに、次のことができます。

$dataString = serialize($blub);

そして、シリアル化された配列は、単純な文字列としてどこにでも書き込めるので、この文字列を再度取得してunserialize()を実行すると、以前とまったく同じ配列構造が得られます。はい、それは本当に簡単です。

4
Mahn

シリアライゼーションという用語が必要な場合と、それがないとどうなるかを知る必要がありますか?

特定の時点でのみ有効な完全な構造(顧客の住所、差出人の住所、製品の位置、税の計算などのすべての関連データを含む請求書など)を保存する必要がある場合、シリアル化は便利になります。

これらのデータはすべて将来的に変更され、新しい税規制が導入される可能性があり、顧客の住所が変更され、製品が寿命を迎えます。ただし、請求書は有効で保存する必要があります。

これはシリアル化で可能です。スナップショットのような。メモリ内のオブジェクトは、(PHPの場合のように)単に格納できるバイナリ形式にシリアル化されます。後で(別のコンテキストで)ライブに戻すことができます。この請求書の例のように:10年後でも、データを読み取ることができ、請求書オブジェクトは10年前と同じです。

言い換えると、シリアル化が必要な場所では、シリアル化がなければ重要な機能が失われます。

それが一例です。常にそれが必要なわけではありませんが、より複雑になった場合は、シリアル化が役立ちます。

3
hakre

javascriptでタグ付けしたので、1つの種類のシリアル化はフォームシリアル化です。

jQuery および prototype.JS の同等物のリファレンスを以下に示します。

基本的には、フォームの入力値をコンマ区切りの名前と値のペアにシリアル化します

実際の使用方法を検討してください。

$.ajax({
   url : 'insert.php?a=10,b=15' //values serialized via .serialize()
   type: 'GET'
});

そして、おそらく_$GET["a"]これらの値を取得するために、私はPHPに精通していません。

1
Robin Maben