ホームページ  >  記事  >  バックエンド開発  >  php でのさまざまなシリアル化の概要と比較

php でのさまざまなシリアル化の概要と比較

黄舟
黄舟オリジナル
2017-03-29 10:09:491220ブラウズ

シリアル化は、変数を保存または送信できる文字列に変換するプロセスです。逆シリアル化は、この文字列を適切なタイミングで使用できるように元の変数に変換することです。これら 2 つのプロセスを組み合わせることで、データの保存と転送が容易になり、プログラムの保守性が向上します。 PHP のさまざまなシリアル化を比較してみましょう。

はじめに

シリアル化とは、オブジェクト状態を永続化または送信できる形式に変換するプロセスです。シリアル化の反対は逆シリアル化で、ストリームをオブジェクトに変換します。これら 2 つのプロセスを組み合わせることで、データの保存と転送が簡単になります。

オブジェクトの状態情報を、保存または送信できる形式に変換するプロセス。 シリアル化中、オブジェクトは現在の状態を一時ストレージまたは永続ストレージに書き込みます。後で、オブジェクトの状態をストアから読み取るか逆シリアル化することで、オブジェクトを再作成できます。

通常、オブジェクト インスタンスのすべてのフィールドはシリアル化されます。これは、データがインスタンスのシリアル化されたデータとして表現されることを意味します。このようにして、形式を解釈できるコードは、メンバーのアクセシビリティに依存せずにデータの値を決定できる可能性があります。同様に、逆シリアル化では、アクセシビリティ ルールに関係なく、シリアル化された表現からデータが抽出され、オブジェクトの状態が直接設定されます。 重要な セキュリティデータを含む可能性のあるオブジェクトについては、可能であればオブジェクトをシリアル化不可能にする必要があります。シリアル化可能にする必要がある場合は、シリアル化できない重要なデータを保持する特定のフィールドを生成してみてください。 これが不可能な場合は、シリアル化権限を持つコードにデータが公開されることに注意し、悪意のあるコードがその権限を取得しないようにする必要があります。

serialize 関数と unserialize 関数

これら 2 つは、PHP でデータをシリアル化および逆シリアル化するために よく使用される関数 です。型や構造を失わずに 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 [c] => Coconut )

?>

配列値に二重引用符、一重引用符、コロンなどの文字が含まれている場合、逆シリアル化後に問題が発生する可能性があります。この問題を克服するための巧妙なトリックは、base64_encodebase64_decode を使用することです。 base64_encodebase64_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_encodejson_decode格式输出要serializeunserialize格式快得多。

     (1) JSON格式是可读的。

     (2) JSON格式比serialize返回数据结果小。

     (3) 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输出长度显然要短。需要注意的是json_encoderrreee

json_encode と json_decode

🎜JSON 形式のシリアル化と逆シリアル化を使用することは良い選択です: 🎜🎜json_encodejson_decode 形式の出力を使用します。 serialize 形式と unserialize 形式ははるかに高速です。 🎜🎜 (1) JSON 形式が読み取り可能です。 🎜🎜 (2) JSON 形式は、serialize によって返されるデータよりも小さいです。 🎜🎜 (3) JSON 形式はオープンで移植可能です。他の言語でも同様に使用できます。 🎜rrreee🎜 上記の例では、 json_encode の出力長は、前の例の serialize の出力長よりも明らかに短くなります。 json_encode はオブジェクトをシリアル化できないことに注意してください。 🎜🎜🎜🎜概要🎜🎜🎜

以上がphp でのさまざまなシリアル化の概要と比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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