• 面向对象的序列化和反序列化


    对象序列化是指: 将一个对象转换成一个字符串,这个字符串包括 属性名,属性值,属性类型, 和该对象对应的类名。简单的说明就把一个对象的数据和数据类型转成字符串.

    案例说明:(需求:将对象保存到文件中)

    class Cat{
        public $name;
        protected $age;
        private $food;
        public function __construct($name,$age,$food){
            $this -> name = $name;
            $this -> age = $age;
            $this -> food = $food;
        }
    }
    $cat1 = new Cat("小花猫",3,"沙丁鱼");
    //将对象保存到文件中,在保存对象前需要将对象序列化
    file_put_contents('./cat.log', serialize($cat1));

     反序列化就是指 :将一个序列化的字符串,重新恢复成对应的对象.

     案例说明:(需求:将文件中的对象读取出来)

    //引入类的定义
    class Cat{
        public $name;
        protected $age;
        private $food;
        public function __construct($name,$age,$food){
            $this -> name = $name;
            $this -> age = $age;
            $this -> food = $food;
        }
    }
    //对象的反序列化
    //1.读取序列化的字符串 传入地址
    $cat_obj_str = file_get_contents('./cat.log');
    //2.进行反序列化操作
    $cat_obj = unserialize($cat_obj_str);
    //如果我们希望正确的操作反序列化对象则需要引入该对象的类定义
    echo '<br>name是' . $cat_obj -> name;

     对象序列化和反序列化的细节:

      (1)如果我们希望正确的操作反序列化对象,则需要引入该对象的类定义

      (2)序列化的优点:

        对象序列化利于对象的保存和传输

        可以让多个文件共享对象,而且我们将序列化后的对象保存到文件中,还可以达到在不同的时间段操作该对象.

      (3)如果类中存在魔术方法 __sleep 序列化该类中的对象则会先调用__sleep函数, 魔术方法返回一个数组,该数组可以选择性的序列化部分属性

       如果类中存在魔术方法__wakeup反序列化该类中的对象时则会先调用__wakeup函数,该魔术方法可以对反序列化的对象制定属性进行初始化或者恢复连接资源

      案例说明:

    class Cat{
        public $name;
        protected $age;
        private $food;
        public function __construct($name,$age,$food){
            $this -> name = $name;
            $this -> age = $age;
            $this -> food = $food;
        }
        //如果类中不存在魔术方法__slppe则会序列化所有属性
        public function __sleep(){
            //可以在返回的数组中决定哪些属性被序列化
            return array('name','food');
        }
        public function __wakeup(){
            $this -> name = '藏獒';
        }
    }
    $cat1 = new Cat("小花猫",3,"沙丁鱼");
    //序列化该对象
    $cat_str = serialize($cat1);
    //将序列化对象后的字符串保存到文件中
    file_put_contents('./cat.log', $cat_str);
    //由于类中存在魔术方法__sleep 输出的结果将只有返回的数组中存在的属性
    var_dump($cat_str);
    //反序列化
    $cat_obj = unserialize($cat_str);
    //由于类中存在魔术方法 __wakeup 则反序列化之前调用的该方法将对象中的name值更改为了藏獒
    var_dump($cat_obj);
  • 相关阅读:
    项目管理理论与实践(6)——利用Excel制作项目文档的设计技巧
    项目管理理论与实践(5)——UML应用(下)
    【工具推荐】ELMAH——可插拔错误日志工具
    ExtJs实践(1)——Ext.extend的用法
    设计一套基于NHibernate二级缓存的MongoDB组件(上)
    ExtJs实践(3)——xtype名称与控件对应
    项目管理理论与实践(2)——软件需求分析
    【培训稿件】构建WCF面向服务的应用程序(包含ppt,源代码)
    ExtJs实践(5)——解决在GridPanel中使用bbar或者tbar的分页条的宽度自适应问题
    项目管理理论与实践(3)——如何进行有效的项目管理
  • 原文地址:https://www.cnblogs.com/rickyctbur/p/11139908.html
Copyright © 2020-2023  润新知