シリアル化は、変数を保存または送信できる文字列に変換するプロセスです。逆シリアル化は、適切なときに使用できるように文字列を元の変数に変換することです。
これら 2 つのプロセスを組み合わせることで、データの保存と転送が容易になり、プログラムの保守性が向上します。
1. シリアル化関数とアンシリアル化関数。これら 2 つは、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:"バナナ";s:1:"c";s:7:"ココナッツ";}
//逆シリアル化
$o=unserialize( $s) ;
print_r($o);
//出力結果:
array('a'=>'Apple','b'=>'バナナ ',' c'=>'Coconut')
ただし、配列値に二重引用符、一重引用符、コロンなどの文字が含まれている場合、逆シリアル化した後に問題が発生する可能性があります。
この問題を解決するには、base64_encode 関数とbase64_decode 関数を使用するという巧妙な方法があります。
$obj=array();
//シリアル化
$s=base64_encode(serialize($obj));
//逆シリアル化
$original=unserialize (base64_decode($s)); Base64 エンコードにより文字列の長さが増加するため、これは完全な解決策ではありません。この問題を解決するには、次のように gzcompress と併用します。
//オブジェクトをシリアル化する関数を定義します
function my_serialize($obj){
returnbase64_encode(gzcompress(serialize($obj)))
//逆シリアル化
function my_unserialize($txt){
return unserialize(gzuncompress(base64_decode($txt)));
}
2. JSON 形式のシリアル化と逆シリアル化を使用します。これは良い選択です。つまり、json_encode と json_decode は、json_encode と json_decode 形式の出力を使用して、形式をより高速にシリアル化およびシリアル化解除します。
JSON 形式は読み取り可能であり、シリアル化よりも小さいデータを返します。また、JSON 形式はオープンで移植可能です。他の言語でも使用できます。具体的な使用例は次のとおりです。
$a=array('a'=>'Apple','b'=>'banana','c '=>' ココナッツ');
//シリアル化された配列
echo $s; ","b ":"banana","c":"Coconut"}
//Deserialization
$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'=>'ココナッツ')
//逆シリアル化
eval('$my_var='.$s.';');
print_r($ my_var);
4. wddx_serialize_value および wddx deserialize メソッド、wddx_serialize_value 関数は配列変数をシリアル化し、XML 文字列として出力できます。
$a=array('a'=>'Apple','b'=>'banana','c'=>'Coconut');
//配列をシリアル化
$s=wddx_serialize_value($a);
echo $s;
//出力結果 (出力文字列のソースコードを表示): ApplebananaCoconut
//逆シリアル化
$ o=wddx_deserialize($s);
print_r($o);
//出力結果: Array([a]=>Apple[b]=>バナナ 1=>ココナッツ)
XML タグ文字が多数あるため、この形式のシリアル化には依然として多くのスペースが必要であることがわかります。
結論: 上記の関数はすべて、配列変数をシリアル化する場合には正常に実行できますが、オブジェクトに適用すると異なります。
たとえば、json_encode シリアル化オブジェクトは失敗します。オブジェクトを逆シリアル化する場合、unserialize と eval の効果は異なります。