ホームページ  >  記事  >  バックエンド開発  >  PHP における SERIALIZE と JSON のシリアル化と逆シリアル化の操作の違いの分析

PHP における SERIALIZE と JSON のシリアル化と逆シリアル化の操作の違いの分析

高洛峰
高洛峰オリジナル
2016-12-20 15:35:441373ブラウズ

この記事の例では、PHP における SERIALIZE と JSON のシリアル化操作と逆シリアル化操作の違いについて説明します。参考までに皆さんと共有してください。詳細は次のとおりです:

PHP における SERIALIZE と JSON のシリアル化と逆シリアル化の違いは何ですか? この問題については、エディターで確認できます。具体的な操作の詳細は次のとおりです。

PHP では、オブジェクトまたは配列をシリアル化または逆シリアル化するためのシリアライズと json の違いは何ですか?

オブジェクトと配列を想定します:

$web = new stdClass;
$web->site = 'tantengvip';
$web->owner = 'tuntun';
$web->age = 5;
//和
$web = array();
$web['site'] = 'tantengvip';
$web['owner'] = 'tuntun';
$web['age'] = 5;

次のように、serialize 関数と unserialize 関数を使用してそれらをシリアル化および逆シリアル化し、出力結果がどのようになるかを確認します:

serialize メソッドを使用します:

var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web)));

結果:

string 'O:8:"stdClass":3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=87)
object(stdClass)[127]
 public 'site' => string 'tantengvip' (length=10)
 public 'owner' => string 'tuntun' (length=6)
 public 'age' => int 5
string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46)
object(stdClass)[127]
 public 'site' => string 'tantengvip' (length=10)
 public 'owner' => string 'tuntun' (length=6)
 public 'age' => int 5

Use json method:

var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web),true));

Result:

string 'a:3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=74)
array (size=3)
 'site' => string 'tantengvip' (length=10)
 'owner' => string 'tuntun' (length=6)
 'age' => int 5
string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46)
array (size=3)
 'site' => string 'tantengvip' (length=10)
 'owner' => string 'tuntun' (length=6)
 'age' => int 5

以前に定義したオブジェクトや配列に対して、serialize と json を使用してシリアル化し、逆シリアル化の結果が元の結果と同じであることがわかりました。シリアル化形式以外に違いはありません

それでは、両者の違いは何でしょうか?次のテキストにこれがよくまとめられているので、コードを書いて検証することはできません。

jsonのシリアル化と逆シリアル化を使用します

利点:

シリアル化後も変数を読み取ることができます

JSON形式が標準であるため、他のシステムでも使用できます

欠点:

UFT-8データのみ有効、他のエンコーディングは使用できない場合がありますうまく動作します

stdClass クラスの例にのみ有効です

シリアル化と逆シリアル化には、serialize メソッドを使用します

利点:

UTF-8 以外の変数を許可します

stdClass の例以外をサポートします 他の例

欠点:

エンコードされたテキスト人間には読めません

他の言語のシステムから参照することはできません

それでは、コードを書いて確認してみましょう:

class Test
{
  private $pri = 'pri';
  public $class = 'Test';
  public function __construct()
  {
    $this->class = 'Test construct';
    $this->pri = 'pri construct';
  }
}
$test = new Test();
var_dump(serialize($test));
var_dump(unserialize(serialize($test)));
var_dump(json_encode($test));
var_dump(json_decode(json_encode($test)));

結果:

string 'O:4:"Test":2:{s:9:"�Test�pri";s:13:"pri construct";s:5:"class";s:14:"Test construct";}' (length=86)
object(Test)[127]
 private 'pri' => string 'pri construct' (length=13)
 public 'class' => string 'Test construct' (length=14)
string '{"class":"Test construct"}' (length=26)
object(stdClass)[127]
 public 'class' => string 'Test construct' (length=14)

JSON のシリアル化と逆シリアル化ではクラス内のプライベート メンバー変数が失われることがわかりました。 Serialize クラスの変数であればシリアル化、逆シリアル化が可能ですが、クラスのメンバメソッドはシリアル化、逆シリアル化できません。

一般的に、json はクロスプラットフォームのユニバーサル形式であるため、json に加えて xml を使用することをお勧めします。では、どのような場合にシリアライズを使用する必要があるのでしょうか?

クラスを逆シリアル化するとき、マジック メソッド __wakeUp() がデフォルトで呼び出されます。これにより、オブジェクトはシリアル化中に保持されなかったさまざまな状態を再確立できます。例: データベース接続など。それは別の質問なので、ここでは詳しく説明しません

この記事が PHP プログラミングのすべての人に役立つことを願っています。

PHP における SERIALIZE と JSON のシリアル化操作と逆シリアル化操作の違い分析に関するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。