シリアル化は、変数を保存または送信できる文字列に変換するプロセスです。逆シリアル化は、この文字列を適切なタイミングで使用できるように元の変数に変換することです。これら 2 つのプロセスを組み合わせることで、データの保存と転送が容易になり、プログラムの保守性が向上します。 PHP のさまざまなシリアル化を比較してみましょう。
はじめに
シリアル化とは、オブジェクト状態を永続化または送信できる形式に変換するプロセスです。シリアル化の反対は逆シリアル化で、ストリームをオブジェクトに変換します。これら 2 つのプロセスを組み合わせることで、データの保存と転送が簡単になります。
オブジェクトの状態情報を、保存または送信できる形式に変換するプロセス。 シリアル化中、オブジェクトは現在の状態を一時ストレージまたは永続ストレージに書き込みます。後で、オブジェクトの状態をストアから読み取るか逆シリアル化することで、オブジェクトを再作成できます。
通常、オブジェクト インスタンスのすべてのフィールドはシリアル化されます。これは、データがインスタンスのシリアル化されたデータとして表現されることを意味します。このようにして、形式を解釈できるコードは、メンバーのアクセシビリティに依存せずにデータの値を決定できる可能性があります。同様に、逆シリアル化では、アクセシビリティ ルールに関係なく、シリアル化された表現からデータが抽出され、オブジェクトの状態が直接設定されます。 重要な セキュリティデータを含む可能性のあるオブジェクトについては、可能であればオブジェクトをシリアル化不可能にする必要があります。シリアル化可能にする必要がある場合は、シリアル化できない重要なデータを保持する特定のフィールドを生成してみてください。 これが不可能な場合は、シリアル化権限を持つコードにデータが公開されることに注意し、悪意のあるコードがその権限を取得しないようにする必要があります。
serialize 関数と unserialize 関数
これら 2 つは、PHP でデータをシリアル化および逆シリアル化するために よく使用される関数 です。型や構造を失わずに 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
を使用することです。 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))); }
json_encode 和 json_decode
使用JSON格式序列化和反序列化是一个不错的选择:
使用json_encode
和json_decode
格式输出要serialize
和unserialize
格式快得多。
(1) JSON
格式是可读的。
(2) JSON
格式比serialize
返回数据结果小。
(3) 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
输出长度比上个例子中serialize
输出长度显然要短。需要注意的是json_encode
rrreee
json_encode と json_decode
🎜JSON 形式のシリアル化と逆シリアル化を使用することは良い選択です: 🎜🎜json_encode
と json_decode
形式の出力を使用します。 serialize 形式と unserialize
形式ははるかに高速です。 🎜🎜 (1) JSON
形式が読み取り可能です。 🎜🎜 (2) JSON
形式は、serialize
によって返されるデータよりも小さいです。 🎜🎜 (3) JSON
形式はオープンで移植可能です。他の言語でも同様に使用できます。 🎜rrreee🎜 上記の例では、 json_encode
の出力長は、前の例の serialize
の出力長よりも明らかに短くなります。 json_encode
はオブジェクトをシリアル化できないことに注意してください。 🎜🎜🎜🎜概要🎜🎜🎜以上がphp でのさまざまなシリアル化の概要と比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。