54

まず第一に、ウィキペディアから、あるいはマニュアルのシリアル化機能からさえ、それの明確な定義を得ることができませでした。PHPシリアル化という用語が必要な場合と、シリアル化なしでどうなるかを知る必要がありますか?言い換えると、シリアル化が必要で、シリアル化がないと、コードにいくつかの重要な機能が欠けてしまいます。

4

5 に答える 5

106

シリアル化とは何ですか?

シリアル化は、オブジェクトを別の形式にエンコードします。
たとえば、PHPには次のような配列があります。

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

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

いくつかの形式の選択肢がありますが、考え方は同じです。配列は、ファイルに書き込んだり、ネットワーク経由で送信したりできるテキストまたはバイトにエンコード(または「変換」と言うこともできます)する必要があります。
たとえば、PHPでは、次の場合に次のようになります。

$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が理解するPHPの特定のシリアル化形式であり、その逆も機能するため、これを使用してオブジェクトを逆シリアル化できます。
たとえば、シリアル化された配列をファイルに保存し、それをコードに配列として戻したいとします。

$array = unserialize($data);

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

$json = json_encode($array);

あなたにこれを与えるでしょう:

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

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

結論
データを保存または共有する場合、シリアル化はオブジェクトを別の形式に変換します。

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

いいえ。しかし、シリアル化は通常、物事を容易にします。

JSONとPHP形式のみが可能な形式ですか?
いいえ、いいえ、いいえ、そしてもう一度いいえ。フォーマットはたくさんあります。

  • SOAP、WSDLなどの後継を持つXML(特定の目的があります)
  • バイト、Protobufなど。
  • Yaml
  • ..。
  • ..。
  • 独自のフォーマット(シリアル化用に独自のフォーマットを作成して使用することはできますが、それは大きなことであり、ほとんどの場合、価値がありません)
于 2012-08-05T16:28:53.653 に答える
21

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

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

serialize()PHP関数は、相互運用不可能な形式を使用しています。これは、オブジェクトのシリアル化と逆シリアル化の両方に使用できるのはPHPのみであることを意味します。

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

于 2012-08-05T16:17:34.617 に答える
4

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

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

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

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

$dataString = serialize($blub);

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

于 2012-08-05T16:24:38.057 に答える
3

シリアル化という用語が必要な場合と、シリアル化なしでどうなるかを知る必要があります。

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

これらのデータはすべて将来変更され、新しい税法が適用される可能性があり、顧客の住所が変更され、製品が使用できなくなります。ただし、請求書は有効で保存されている必要があります。

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

言い換えると、シリアル化が必要で、シリアル化がないと、コードにいくつかの重要な機能が欠けてしまいます。

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

于 2012-08-05T16:35:21.770 に答える
1

でタグ付けしているのでjavascript、シリアル化の1つの種類はフォームのシリアル化である可能性があります。

jQueryprototype.JSに相当するもののリファレンスは次のとおりです。

彼らが基本的に行うことは、フォームの入力値をコンマで区切られた名前と値のペアにシリアル化することです

したがって、実際の使用法を検討します。

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

そして、あなたはおそらく$GET["a"]それらの値を取得するために行うでしょう、しかし私はPHPに精通していません。

于 2012-08-05T16:13:31.633 に答える