オブジェクトのシリアル化は、後で使用するためにオブジェクトの状態を保存する必要がある場合に役立ちます。たとえば、ユーザー設定などを保持するユーザーオブジェクトがあるとします。Webはステートレスであるため、リクエストごとにそのオブジェクトを失います。ただし、そのオブジェクトをシリアル化してセッション変数に保存するとすると、そのオブジェクトはシリアル化を解除することで再構築できるため、最後のリクエストで既に持っていた新しいオブジェクトを再構築する必要がなくなります。
補足:オブジェクトをシリアル化してから非シリアル化すると、オブジェクトのディープコピーも実行され、(クローン)は浅いコピーのみを実行します。
シリアル化の例
<?php
class User {
private $name = "";
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
/*
public function __sleep() {
print "sleep";
}
public function __wakeup() {
print "wakeup";
}
*/
}
$user = new User("Andrew Schools");
$userSerialized = serialize($user); // usually you would save this in a session or DB
$user2 = unserialize($userSerialized);
echo $user->getName();
echo "<br />";
echo $user2->getName();
echo "<br />";
var_dump($user);
var_dump($user2);
?>
これにより、次のように出力されます。
Andrew Schools
Andrew Schools
class User#1 (1) {
private $name =>
string(14) "Andrew Schools"
}
class User#2 (1) {
private $name =>
string(14) "Andrew Schools"
}
ご覧のとおり、オブジェクトをシリアル化前の状態に復元できます。また、__ sleep()関数は、シリアル化が開始される前にトリガーされるため、クリーンアップを実行できます。また、__ wakeupはシリアル化解除後に呼び出されるため、オブジェクトが復元された後に追加のタスクを実行できます。