zoukankan      html  css  js  c++  java
  • php serialize(),unserialize()

    序列化serialize()与反序列化unserialize():

    序列化serialize():就是将一个变量所代表的 “内存数据”转换为“字符串”的形式,并持久保存在硬盘(写入文件中保存)上的一种做法,即,把“内存数据”转换为“字符串”然后保存到文件中;

    反序列化unserialize():就是将序列化之后保存在硬盘(文件)上的“字符串数据”恢复为其原来的内存形式的变量数据的一种做法,即,把文件中保存的序列化后的“字符串数据”恢复为“内存数据”;

    对象的序列化:1.对一个对象进行序列化,只能将其属性数据“保存起来”,而方法被忽略(方法不是数据),但是类名也能被保存起来,因此反序列化的位置只要有该类文件,就仍然可以将对象还原,即该对象的属性和方法依然可以使用;

        2.对象序列化的时候,会自动调用该对象所属类的__sleep()魔术方法;

    对象的反序列化:1.对一个对象进行反序列化,其实是恢复原来保存起来的属性数据,而且,此时必须需要依赖该对象原来的所属类;

    2.对象反序列化的时候,会自动调用该对象所属类的__wakeup()魔术方法;

    总结:一般当我们需要将数据保存到文件中时会用到序列化,保存到数据库中一般不这样用,因为序列化和反序列化的过程其实很耗时;

    使用实例如下:

    <?php
    /*
     * 对基本数据进行序列化和反序列化
     * */
    $v1 = 1 ;
    $v2 = "abc" ;
    $v3 = false ;
    $v4 = array(41,42,43) ;
    /*再对它们进行序列化*/
    $str1 = serialize($v1) ;//将内存数据转换为字符串
    $str2 = serialize($v2) ;
    $str3 = serialize($v3) ;
    $str4 = serialize($v4) ;
    file_put_contents("./file1.txt",$str1) ;//将序列化后的字符串数据保存到硬盘(文件)中
    file_put_contents("./file2.txt",$str2) ;//将序列化后的字符串数据保存到硬盘(文件)中
    file_put_contents("./file3.txt",$str3) ;//将序列化后的字符串数据保存到硬盘(文件)中
    file_put_contents("./file4.txt",$str4) ;//将序列化后的字符串数据保存到硬盘(文件)中
    /*再对它们进行反序列化*/
    $str1 = file_get_contents('./file1.txt') ;//读取硬盘(文件)上保存的序列化后的字符串数据
    $str2 = file_get_contents('./file2.txt') ;//读取硬盘(文件)上保存的序列化后的字符串数据
    $str3 = file_get_contents('./file3.txt') ;//读取硬盘(文件)上保存的序列化后的字符串数据
    $str4 = file_get_contents('./file4.txt') ;//读取硬盘(文件)上保存的序列化后的字符串数据
    $v1 = unserialize($str1) ; //将序列化后的“字符串数据”反序列化为“内存数据”
    $v2 = unserialize($str2) ; //将序列化后的“字符串数据”反序列化为“内存数据”
    $v3 = unserialize($str3) ; //将序列化后的“字符串数据”反序列化为“内存数据”
    $v4 = unserialize($str4) ; //将序列化后的“字符串数据”反序列化为“内存数据”
    /*
     * 对象的序列化和反序列化
     * */
    /*当new一个类的对象时,若该类不存在,就会自动调用该方法来加载所需要的类文件*/
    function __autoload($className){//php的自动加载类,参数为类名,类文件命名规则为:类名.class.php
    $fileName =  "./".$className.".class.php" ;
        include_once $fileName ;
    }
    $obj1 = new MP3Player();
    $name1 = $obj1 ->name ;
    $obj1 ->dataIn() ;
    $obj1 ->next() ;
    /*序列化对象*/
    $s1 = serialize($obj1) ;//将obj1对象转换为字符串数据
    file_put_contents('./obj1.txt',$s1) ;//保存在硬盘(文件)中
    /*反序列化对象*/
    $s1 = file_get_contents('./obj1.txt') ;//读取硬盘上的字符串数据
    $obj2 = unserialize($s1) ;//将序列化后的字符串数据还原为内存数据
    $name2 = $obj2 ->name ;
    /*虽然序列化后只保存了对象的属性数据而没有保存对象的方法,但是其保存了对象的类名,
    *所以进行反序列化后对象内的方法任然存在,仍然可以供对象调用,反序列化的过程
     * 就是对原来对象进行恢复的过程*/
    $obj2 ->dataIn() ;
    $obj2 ->next() ;
    

      

  • 相关阅读:
    移动开发 Native APP、Hybrid APP和Web APP介绍
    urllib与urllib2的学习总结(python2.7.X)
    fiddler及postman讲解
    接口测试基础
    UiAutomator2.0 和1.x 的区别
    adb shell am instrument 命令详解
    GT问题记录
    HDU 2492 Ping pong (树状数组)
    CF 567C Geometric Progression
    CF 545E Paths and Trees
  • 原文地址:https://www.cnblogs.com/cblx/p/9216337.html
Copyright © 2011-2022 走看看