tetsunosukeのnotebook

tetsunosukeのメモです

Serialize/Unserializeを試してみる

Using Serialized PHP with Yahoo! Web Servicesが出てからちょっと話題になっているSerializeまわり。

とりあえずPHPにおける変数のSerializeについてよく知らんのでやってみる。

<?php

$array = array("key" => "val");
$int = 10;
$string = "string";

$object = new MyClass();


print serialize($array);
print "\n";
print serialize($int);
print "\n";
print serialize($string);
print "\n";
print serialize($object);


class MyClass{
    var $mem;
    function MyClass()
    {
        $this->mem = "initial value";
    }
}
?>

以下が実行結果。型と長さを情報として持っているんですね。どうやらaがarrayで、iがinteger、sがstringでOがObjectの模様。

a:1:{s:3:"key";s:3:"val";}
i:10;
s:6:"string";
O:7:"myclass":1:{s:3:"mem";s:13:"initial value";}

で、こいつをunserializeで復元してみる。

<?php
$s_array = 'a:1:{s:3:"key";s:3:"val";}';
$s_int = 'i:10';
$s_string = 's:6:"string"';
$s_object = 'O:7:"myclass":1:{s:3:"mem";s:13:"initial value";}';
print_r(unserialize($s_array));
print "\n";
print unserialize($s_int);
print "\n";
print unserialize($s_string);
print "\n";
var_dump(unserialize($s_object));

?>

実行結果

Array
(
    [key] => val
)


string
object(__PHP_Incomplete_Class)(2) {
  ["__PHP_Incomplete_Class_Name"]=>
  string(7) "myclass"
  ["mem"]=>
  string(13) "initial value"
}

おお。元に戻った?*1
でも、このままではIncomplete_Classなので、ちゃんとクラスも書いておかないとだめ。

<?php
$s_array = 'a:1:{s:3:"key";s:3:"val";}';
$s_int = 'i:10';
$s_string = 's:6:"string"';
$s_object = 'O:7:"myclass":1:{s:3:"mem";s:13:"initial value";}';
print_r(unserialize($s_array));
print "\n";
print unserialize($s_int);
print "\n";
print unserialize($s_string);
print "\n";
var_dump(unserialize($s_object));
class MyClass{
    var $mem;
    function MyClass()
    {
        $this->mem = "initial value";
    }
}
?>

そしたら実行結果はこうなりました。

Array
(
    [key] => val
)


string
object(myclass)(1) {
  ["mem"]=>
  string(13) "initial value"
}

これで、

$obj = unserialize($s_object);
print $obj->mem;

とすればメンバ変数も扱える。
なるほどー。

今度はXMLをこの形にしてみる予定。
PEAR::XML_Serializerを使うらしいよ。

*1:あれっ?!integerが元に戻っていない・・・