聊一聊php的序列化

最近在项目种经常用redis缓存数据序列化的数据,有点心得,我们现在聊一聊php的序列化操作

我们经常使用的是一对学列化函数serializeunserialize。常用的操作很简单,就是:

  1. 使用serialize序列化我们的变量使其变成字符串。

    1
    2
    3
    $data = ['id'=>1, 'name'=>'xiaoming', 'sex'=>1];
    $dataString = serialize($data);
    // echo $dataString
  2. 这些字符串可以离线保存到文件、数据库或者一些缓存介质中。

    1
    2
    // example
    $redis->set('test_user1', $dataString);
  3. 在使用的时候从上面的一些介质中取出字符串,然后调用unserialize反序列化到变量。

    1
    2
    $dataString = $redis->get('test_user1');
    $data = unserialize($dataString);

我们再看看php各种数据类型序列化之后的结果如何:

  1. 整型int

    1
    2
    echo serialize(1);
    // 输出 i:1;
  2. 浮点型float

    1
    2
    echo serialize(1.1);
    // 输出 d:1.1;
  3. 布尔bool

    1
    2
    3
    4
    echo serialize(true);
    // 输出 b:1;
    echo serialize(false);
    // 输出 b:0;
  4. 空值null

    1
    2
    echo serialize(null);
    // 输出 n:1;
  5. 字符串string

    1
    2
    echo serialize('1');
    // 输出 s:1:"1";
  6. 数组array

    1
    2
    3
    4
    echo serialize([]); //空数组
    // 输出 a:0:{}
    echo serialize([1]);
    // 输出 a:1:{i:0;i:1;}
  7. 对象object

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class A{}
    $a = new A();
    echo serialize($a);
    // 输出 O:1:"A":0:{}

    class B{
    public $name;
    }
    $b = new B();
    echo serialize($b);
    // 输出 O:1:"B":1:{s:4:"name";N;}

    $c = new stdClass();
    echo serialize($b);
    // 输出 O:8:"stdClass":0:{}

    $d = function(){
    return 1;
    };
    echo serialize($d);
    // 输出报错 PHP Warning: Uncaught Exception: Serialization of 'Closure' is not allowed
  8. 资源resource

    1
    2
    3
    4
    $f = fopen("/tmp/t.txt", "r");  //假如文件/tmp/t.txt存在
    echo serialize($f);
    fclose($f);
    // 输出 todo

从上面可以看来php的serialize函数无法序列化一个匿名函数

(未完待续)

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信