ホームページ >バックエンド開発 >PHPチュートリアル >PHP の複数のシリアル化/逆シリアル化メソッド

PHP の複数のシリアル化/逆シリアル化メソッド

WBOY
WBOYオリジナル
2016-06-23 13:47:081180ブラウズ

シリアル化は、変数を保存または送信できる文字列に変換するプロセスであり、逆シリアル化は、この文字列を適切なときに使用できるように元の変数に変換することです。これら 2 つのプロセスを組み合わせることで、データの保存と転送が容易になり、プログラムの保守性が向上します。

1. シリアライズ関数とアンシリアライズ関数

これら 2 つは、PHP でデータをシリアライズおよびデシリアライズするための一般的な関数です。

<?php$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组$s = serialize($a);echo $s;//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}echo '<br /><br />';//反序列化$o = unserialize($s);print_r($o);//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut ) ?>

逆シリアル化後に配列値に二重引用符、一重引用符、コロンなどの文字が含まれる場合、問題が発生する可能性があります。この問題を克服するための巧妙なトリックは、base64_encode とbase64_decode を使用することです。

$obj = array();//序列化$s = base64_encode(serialize($obj)); //反序列化$original = unserialize(base64_decode($s)); 

ただし、base64 エンコードでは文字列の長さが長くなります。この問題を解決するには、gzcompress と併用します。

//定义一个用来序列化对象的函数function my_serialize( $obj ) {    return base64_encode(gzcompress(serialize($obj))); } //反序列化function my_unserialize($txt) {    return unserialize(gzuncompress(base64_decode($txt))); }

2. json_encode と json_decode

JSON 形式のシリアル化と逆シリアル化を使用することは良い選択です:

シリアル化と非シリアル化には json_encode と json_decode 形式の出力を使用します。はるかに速くなります。
  • JSON形式が読み取り可能です。
  • JSON 形式はシリアル化よりも小さいデータ結果を返します。
  • JSON 形式はオープンで移植可能です。他の言語でも同様に使用できます。

  • $a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组$s = json_encode($a);echo $s;//输出结果:{"a":"Apple","b":"banana","c":"Coconut"}echo '<br /><br />';//反序列化$o = json_decode($s);


    上記の例では、json_encode 出力の長さは、前の例のシリアライズ出力の長さよりも明らかに短くなります。

    3. var_export と eval

    var_export 関数は変数を文字列として出力し、eval は文字列を PHP コードとして実行し、それを逆シリアル化して元の変数の内容を取得します。

    $a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组$s = var_export($a , true);echo $s;//输出结果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', )echo '<br /><br />';//反序列化eval('$my_var=' . $s . ';');print_r($my_var);



    4. wddx_serialize_value と wddx deserialize

    wddx_serialize_value 関数は、配列変数をシリアル化し、XML 文字列として出力できます。ご覧のとおり、X ML タグには多くの文字が含まれているため、この形式でシリアル化すると依然として多くのスペースが必要になります。

    概要

    上記の関数はすべて、配列変数をシリアル化する場合は通常どおり実行できますが、オブジェクトに適用する場合は異なります。たとえば、json_encode シリアル化オブジェクトは失敗します。オブジェクトを逆シリアル化する場合、unserialize と eval の効果は異なります。

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