前回マジックメソッド__sleep、__wakeupによるシリアライズを行いましたが、今回はSerializableインターフェイスで同じことを行ってみます。
両者がどう違うかというと、マジックメソッド__sleepはあくまでシリアライズ対象を変更できるだけであったのに対し、Serializableインターフェイスによるシリアライズは出力をわりかし自由にできるという点です。
SerialExample2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
//適当なクラス
class SerialExample implements Serializable{
//インスタンス変数とか
private $string_serial='';
private $string_no_serial='';
//セッタゲッタ
public function __set($name,$value){
if($name=='string_serial' || $name=='string_no_serial'){
$this->{$name}=$value;
return true;
}else{
return false;
}
}
public function __get($name){
if($name=='string_serial' || $name=='string_no_serial'){
return $this->{$name};
}else{
return false;
}
}
//シリアライズ
public function serialize(){
//シリアライズした文字列を返す
return mcrypt_encrypt(MCRYPT_DES,'hogehoge'
,$this->string_serial,MCRYPT_MODE_ECB);
}
//アンシリアライズ
public function unserialize($serial){
//シリアライズされた文字列を元に戻す
$this->string_serial=mcrypt_decrypt(MCRYPT_DES,'hogehoge'
,$serial,MCRYPT_MODE_ECB);
}
//↓クラスのおわり
}
|
serialize2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//SerialExample
require_once('SerialExample2.php');
$example=new SerialExample();
//適当
$example->string_serial='aaaaaaaa';
$example->string_no_serial='bbbbbbbb';
//シリアライズ
$serial=serialize($example);
//アンシリアライズ
$desilial=unserialize($serial);
var_dump($serial,$example,$desilial);
|
シリアライズ時にSerialExample::serializeが呼ばれ、シリアライズ後の文字列は、
string 'C:13:"SerialExample":8:{mィ^ョ・シ+}' (length=33)
というふうに暗号化されたなんだかよくわからない文字列となります。
周囲の'C:13'や'SerialExample'等はPHPが必要に応じて自動的に付けるので、実際に変更できるのはその後の{}の中となります。
今回は簡単な暗号化を行いました。
逆にアンシリアライズ時にはSerialExample::unserializeが呼ばれます。
object(SerialExample)[2] private 'string_serial' => string 'aaaaaaaa' (length=8) private 'string_no_serial' => string '' (length=0)
SerialExample::string_serialには無事、復号化後の文字列が収まりました。
PR
トラックバック
トラックバックURL: