ホームページ  >  記事  >  バックエンド開発  >  PHP は複数のシリアル化/逆シリアル化メソッドを実装します

PHP は複数のシリアル化/逆シリアル化メソッドを実装します

墨辰丷
墨辰丷オリジナル
2018-05-21 10:38:211489ブラウズ

この記事では主に PHP でのさまざまなシリアル化/逆シリアル化メソッドを実装する方法を紹介します。興味のある方はぜひ参考にしてください。

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

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

1. 関数のシリアル化とシリアル化解除

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

<?php
 
$a = array(&#39;a&#39; => &#39;Apple&#39; ,&#39;b&#39; => &#39;banana&#39; , &#39;c&#39; => &#39;Coconut&#39;);
 
//序列化数组
 
$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 &#39;<br /><br />&#39;;
 
//反序列化
 
$o = unserialize($s);
 
print_r($o);
 
//输出结果 Array ( [a] => Apple [b] => banana => Coconut )
 
?>

//反序列化
$o = unserialize($s);
print_r($o);
//输出结果 Array ( [a] => Apple [b] => banana => 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(&#39;a&#39; => &#39;Apple&#39; ,&#39;b&#39; => &#39;banana&#39; , &#39;c&#39; => &#39;Coconut&#39;);
//序列化数组
$s = json_encode($a);
echo $s;
//输出结果:{"a":"Apple","b":"banana","c":"Coconut"}
echo &#39;<br /><br />&#39;;
//反序列化
$o = json_decode($s);

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

3. var_export と eval

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

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

4. wddx_serialize_value 関数と wddx deserialize

wddx_serialize_value 関数は、配列変数をシリアル化し、XML 文字列として出力できます。

$a = array(&#39;a&#39; => &#39;Apple&#39; ,&#39;b&#39; => &#39;banana&#39; , &#39;c&#39; => &#39;Coconut&#39;);
 
//序列化数组
$s = wddx_serialize_value($a);
echo $s;
 
//输出结果(查看输出字符串的源码):<wddxPacket version=&#39;1.0&#39;><header/><data><struct><var name=&#39;a&#39;><string>Apple</string></var><var name=&#39;b&#39;><string>banana</string></var><var name=&#39;c&#39;><string>Coconut</string></var></struct></data></wddxPacket>
 
echo &#39;<br /><br />&#39;;
 
//反序列化
$o = wddx_deserialize($s);
print_r($o);
//输出结果:Array ( [a] => Apple [b] => banana 1 => Coconut )

XML タグ文字が多数あるため、この形式のシリアル化には依然として多くのスペースが必要であることがわかります。

概要

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

以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。

関連する推奨事項:

phpデータシリアル化テストの詳細な説明

ネイティブjsを使用してフォームを実装するシリアル化 (グラフィックチュートリアル)

PHP 連載とアンチ連載関数例を詳しく解説

以上がPHP は複数のシリアル化/逆シリアル化メソッドを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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