序列化serialize与反序列化unserialize

有利于存储和传递value(除了resource类型外),却不会丢失其原有类型和结构。

serialize序列化时会调用魔术方法__sleep();

unserialize反序列化时会调用魔术方法__wakeup();

序列化 数组:

$arr = ['name'=>'Tony','age'=>29,'sex'=>'male'];
$s = serialize($arr);
echo '序列化数组:';
var_dump($s);
echo '反序列化数组:';
var_dump(unserialize($s));

  输出

E:Projectselfdemoserializedemo.php:8:string 'a:3:{s:4:"name";s:4:"Tony";s:3:"age";i:29;s:3:"sex";s:4:"male";}' (length=64)
反序列化数组:
E:Projectselfdemoserializedemo.php:10:
array (size=3)
  'name' => string 'Tony' (length=4)
  'age' => int 29
  'sex' => string 'male' (length=4)

序列化对象:

新建一个对象:

class A{
    public $one = 1;
    public function show_one(){
        echo $this->one;
    }
}
require_once('class_a.php');
$s = serialize(new A);
//把变量$s保存起来以便其他地方能够读取到
file_put_contents('store', $s);
require_once('class_a.php');
$s = file_get_contents('store');
$a = unserialize($s);
var_dump($s);
var_dump($a);
//现在使用对象$a里面的函数
$a->show_one();

  输出

E:Projectselfdemoserializedemo.php:18:string 'O:1:"A":1:{s:3:"one";i:1;}' (length=26)
E:Projectselfdemoserializedemo.php:19:
object(A)[1]
  public 'one' => int 1
1

危害与防御:

当用户对于反序列化的参数是可控的,利用__toString等是很容易造成意想不到的危害,所以最好在参数外面再套一层,例如json_decode。

 https://www.jb51.net/article/107110.htm

原文地址:https://www.cnblogs.com/two-bees/p/10606134.html