ホームページ  >  記事  >  バックエンド開発  >  PHP での複数のシリアル化例の分析

PHP での複数のシリアル化例の分析

小云云
小云云オリジナル
2018-02-12 09:52:361067ブラウズ

シリアル化は、変数を保存または送信できる文字列に変換するプロセスです。逆シリアル化は、使用する適切な時点でこの文字列を元の変数に変換することです。この 2 つのプロセスを組み合わせることで、データの保存と送信が容易になり、プログラムの保守性が向上します。この記事では、PHP のさまざまなシリアル化/逆シリアル化メソッドについて詳しく説明します。そしてみんなに参考にしてもらいましょう。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

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 出力の長さは、前の例の Serialize 出力の長さよりも明らかに短くなります。

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 の効果は異なります。

関連する推奨事項:

js を使用してフォームのシリアル化を実装し、null 値を決定する方法

PHP データのシリアル化テストについて

jQuery フォームのシリアル化サンプル コード例の共有

以上がPHP での複数のシリアル化例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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