シリアル化は、変数を保存または送信できる文字列に変換するプロセスです。逆シリアル化は、適切なときに使用できるように文字列を元の変数に変換することです。これら 2 つのプロセスを組み合わせることで、データの保存と転送が容易になり、プログラムの保守性が向上します。
1. シリアル化関数とシリアル化解除関数
これら 2 つは、PHP でデータをシリアル化および逆シリアル化するための一般的な関数です。
PHP コード
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut') // シリアル化された配列 $ s =serialize($a); //出力結果: a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6: "バナナ";s:1:"c";s:7:"ココナッツ";} echo '
PHP コード
$obj = array(); //シリアル化 $s =base64_encode(serialize($obj)) //デシリアライズ $original = unserialize(base64_decode($s));エンコードすると文字列の長さが長くなります。この問題を解決するには、gzcompress を使用します。 PHPコード
//「 's’ s ’' s 's' s 's' s 's' s 'and ize($ txt)を使用して使用するオブジェクトをシリアル化するために使用される関数を定義します{eおよびjson_decode形式の出力をreturnフォーマットのシリアル化とシリアル化解除ははるかに高速です。 JSON 形式は人間が判読できます。 JSON 形式はシリアル化よりも小さいデータを返します。 JSON 形式はオープンで移植可能です。他の言語でも同様に使用できます。
PHP コード
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut') //シリアル化された配列 $s = json_encode($a); echo $s; // 出力結果: {"a":"Apple","b":"banana","c":"Coconut"} echo '
br />'; //Deserialization $o = json_decode($s);
上記の例では、json_encode 出力の長さは前の例のシリアライズ出力長よりも明らかに短くなります。
3. var_export と eval
var_export 関数は変数を文字列として出力し、eval は文字列を PHP コードとして実行し、逆シリアル化して元の変数の内容を取得します。
PHP コード
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut') // シリアル化された配列 $ s = var_export($a, true); //出力結果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'ココナッツ' , ) echo '
' //逆シリアル化 eval('$my_var=' . $s . ';');
4. deserialize
wddx_serialize_value 関数は、配列変数をシリアル化し、XML 文字列として出力できます。
PHP コード
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut') //配列をシリアル化 $s = wddx_serialize_value($a); $s; //出力結果 (出力文字列のソース コードを表示):
' //逆シリアル化 $ o = wddx_deserialize($s); print_r($o); //出力結果: Array ( [a] => Apple [b] => Banana 1 => Coconut )
ご覧のとおり、XML はtag 文字数が多いので、この形式で連載するとやはり容量が大きくなってしまいます。
結論
上記の関数はすべて、配列変数をシリアル化する場合には正常に実行できますが、オブジェクトを使用する場合は異なります。たとえば、json_encode シリアル化オブジェクトは失敗します。オブジェクトを逆シリアル化する場合、unserialize と eval の効果は異なります。
英語原文: phpで変数をシリアル化する3つの方法