ホームページ > 記事 > ウェブフロントエンド > php_javascript スキルにおけるシリアル化と json の使用法の概要
【連載のコンセプト】
シリアル化は、オブジェクトの状態を永続化または転送可能な形式に変換するプロセスです。シリアル化の反対は逆シリアル化で、ストリームをオブジェクトに変換します。これら 2 つのプロセスを組み合わせることで、データの保存と転送が簡単になります。
オブジェクトの状態情報を、保存または送信できる形式に変換するプロセス。 シリアル化中、オブジェクトは現在の状態を一時ストレージまたは永続ストレージに書き込みます。後で、オブジェクトの状態をストアから読み取るか逆シリアル化することで、オブジェクトを再作成できます。
通常、オブジェクト インスタンスのすべてのフィールドはシリアル化されます。これは、データがインスタンスのシリアル化されたデータとして表されることを意味します。このようにして、形式を解釈できるコードは、メンバーのアクセシビリティに依存せずにこのデータの値を決定できる可能性があります。同様に、逆シリアル化では、アクセシビリティ ルールに関係なく、シリアル化された表現からデータが抽出され、オブジェクトの状態が直接設定されます。 重要なセキュリティ データが含まれる可能性のあるオブジェクトは、可能であればシリアル化不可能にする必要があります。シリアル化可能にする必要がある場合は、シリアル化できない重要なデータを保持する特定のフィールドを生成してみてください。これが不可能な場合は、シリアル化権限を持つコードにデータが公開されることに注意し、悪意のあるコードがその権限を取得しないようにする必要があります。
[JSON の概念]
JSON、JavaScript Object Notation。インターフェイス (AJAX、REST など) データ交換用の軽量で使いやすい形式です。 JSON は、構造化データをシリアル化するためのテキスト形式であり、XML の代わりに、クライアントとサーバー間のデータ交換のペイロードを表すために使用されます。これは ECMAScript 言語標準から派生したものです。 JSON の設計目標は、JSON を小さく、軽量で、テキスト形式にし、JavaScript のサブセットにすることです。
【長さの比較】
次のコードは、配列とオブジェクトをエンコードした後に生成される文字列とその長さを示しています
public $int = 1;
public $bool = TRUE;
public $array = array(array(1), 2 => 'test', 'string');
public function test($flag) {
echo $flag, 'Foo のテスト関数
';
}
public static function Output($str) {
echo $str, '
';
}
public static function Compare_serialize_and_json($data) {
$serialize_str = Serialize($data);
self::output('シリアル化された値:' . $serialize_str . "; length=" .
strlen($serialize_str));
$json_str = json_encode($data);
self::output('JSON 後の値:' . $json_str . "; length=" . strlen($json_str));
}
}
$test_data = array('wwww' => 0, 'phppan' => 1, 'com' => 2);
//シリアル化された配列
echo 'Array:
';
Foo::compare_serialize_and_json($test_data);
$foo = new Foo();
echo 'Object:
';
Foo::compare_serialize_and_json($foo);
出力:
明らかな長さの違い。エンコード後のシリアライズは json の約 2 倍の長さです。
理由:
•シリアル化後、文字列には部分文字列の長さが含まれます。これは速度の最適化、典型的な時間の最適化である可能性がありますが、それ自体はまだ重すぎます。
•Serializeにはより詳細な型の区別がありますが、jsonには4つの型しかなく、それらは単純な記号で表されます。
【速度比較】
コードの問題を説明します。次のコードは速度を比較しています。
echo 'serialize:
';
$start = xdebug_time_index();
for ($i = 0; $i $ str = Serialize($array);
}
$end = xdebug_time_index();
echo $end - $start, '
';
echo 'json:
';
$start = xdebug_time_index();
for ($i = 0; $i $ str = json_encode($array);
}
$end = xdebug_time_index();
echo $end - $start, '
';
unset($array, $ str);
出力:
データ量が多い場合、シリアライズの速度はjsonよりも一桁速いです。
上記の 2 つの点から、速度と生成される文字列のサイズの点で json はシリアライズよりも優れているのに、なぜシリアライズがまだ存在するのでしょうか? その理由は実装されている機能にあります。
【処理対象】
次のコード:
$foo = new Foo();
echo '逆シリアル化テスト:
';
$foo->test(1);
$serialize_str = Serialize($foo);
$obj = unserialize ($ serialize_str);
$obj->test(2);
$foo->test(1);
$json_str = json_encode($foo);
$obj = json_decode($json_str);
$obj->test(2);
die();
出力:
( ! ) 致命的なエラー: 未定義のメソッド stdClass::test() の呼び出し
json はオブジェクトメソッドなどのデータを扱うことができません。
【利用範囲】
•シリアル化、特にオブジェクトストレージの場合は、serialize を使用します。これがその存在意義です。
•Json は、大きな数値を含む配列など、オブジェクトに依存しないデータ ストレージに使用できます。しかし、この状況に遭遇した場合、データベースを再構築する必要があるかもしれません。
•JSON はデータ交換に使用され、その定義はここにあります。
•現在、JSON は UTF-8 でエンコードされたデータに使用できます。