zoukankan      html  css  js  c++  java
  • 文件读取的时候要留意 -- 序列化serialize()与反序列化unserialize():

    原文:https://blog.csdn.net/little_rabbit_baby/article/details/53840543 

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

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

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

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

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

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

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

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

    使用实例如下:

     1 <?php
     2 /*
     3  * 对基本数据进行序列化和反序列化
     4  * */
     5 $v1 = 1 ;
     6 $v2 = "abc" ;
     7 $v3 = false ;
     8 $v4 = array(41,42,43) ;
     9 /*再对它们进行序列化*/
    10 $str1 = serialize($v1) ;//将内存数据转换为字符串
    11 $str2 = serialize($v2) ;
    12 $str3 = serialize($v3) ;
    13 $str4 = serialize($v4) ;
    14 file_put_contents("./file1.txt",$str1) ;//将序列化后的字符串数据保存到硬盘(文件)中
    15 file_put_contents("./file2.txt",$str2) ;//将序列化后的字符串数据保存到硬盘(文件)中
    16 file_put_contents("./file3.txt",$str3) ;//将序列化后的字符串数据保存到硬盘(文件)中
    17 file_put_contents("./file4.txt",$str4) ;//将序列化后的字符串数据保存到硬盘(文件)中
    18 /*再对它们进行反序列化*/
    19 $str1 = file_get_contents('./file1.txt') ;//读取硬盘(文件)上保存的序列化后的字符串数据
    20 $str2 = file_get_contents('./file2.txt') ;//读取硬盘(文件)上保存的序列化后的字符串数据
    21 $str3 = file_get_contents('./file3.txt') ;//读取硬盘(文件)上保存的序列化后的字符串数据
    22 $str4 = file_get_contents('./file4.txt') ;//读取硬盘(文件)上保存的序列化后的字符串数据
    23 $v1 = unserialize($str1) ; //将序列化后的“字符串数据”反序列化为“内存数据”
    24 $v2 = unserialize($str2) ; //将序列化后的“字符串数据”反序列化为“内存数据”
    25 $v3 = unserialize($str3) ; //将序列化后的“字符串数据”反序列化为“内存数据”
    26 $v4 = unserialize($str4) ; //将序列化后的“字符串数据”反序列化为“内存数据”
    27 
    28 /*
    29  * 对象的序列化和反序列化
    30  * */
    31 /*当new一个类的对象时,若该类不存在,就会自动调用该方法来加载所需要的类文件*/
    32 function __autoload($className){//php的自动加载类,参数为类名,类文件命名规则为:类名.class.php
    33     $fileName =  "./".$className.".class.php" ;
    34     include_once $fileName ;
    35 }
    36 $obj1 = new MP3Player();
    37 $name1 = $obj1 ->name ;
    38 $obj1 ->dataIn() ;
    39 $obj1 ->next() ;
    40 /*序列化对象*/
    41 $s1 = serialize($obj1) ;//将obj1对象转换为字符串数据
    42 file_put_contents('./obj1.txt',$s1) ;//保存在硬盘(文件)中
    43 /*反序列化对象*/
    44 $s1 = file_get_contents('./obj1.txt') ;//读取硬盘上的字符串数据
    45 $obj2 = unserialize($s1) ;//将序列化后的字符串数据还原为内存数据
    46 $name2 = $obj2 ->name ;
    47 /*虽然序列化后只保存了对象的属性数据而没有保存对象的方法,但是其保存了对象的类名,
    48 *所以进行反序列化后对象内的方法任然存在,仍然可以供对象调用,反序列化的过程
    49  * 就是对原来对象进行恢复的过程*/
    50 $obj2 ->dataIn() ;
    51 $obj2 ->next() ;

    serialize和json_encode 区别

    1)serialize主要用于php的序列化,存储到文件或者数据库中,json_encode 也是序列化,但是 主要用于与其他语言比如js进行交互使用,对于传输来说,json有许多优点。

    (2)在显示上,serialize序列化的字符串包含额外的内容,这是值的类型和长度的编码

    (3)在进行 json_decode解码的时候需要注意,如果是序列化的数值型数组,那么json_decode 可以还原为原来的数组(数值型数组哦),但是,如果序列化的是关联数组(或者对象),那么由于json_decode无法判断是关联数组还是对象(我们可以理解为这两个长的像无法区分),所以json_decode会默认还原解析为stdclass的对象,如果加了true才解析为关联数组

    (4)json_encode不能序列化对象的成员方法,代码如下:

      serialize序列化之后,反序列化的数据,可以重新调用成员方法,但是json_decode不行,会报错,具体可以测试、

    (5)__sleep和__wakeUp魔术方法

        当一个对象被串行化,PHP会调用__sleep方法(如果存在的话,并且进行操作,比如对变量赋值). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值. 如果没有__sleep方法,PHP将保存所有属性.
          在程序执行前,serialize() 函数会首先检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用, 然后才执行串行化(序列化)操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组(必须返回。与之相反,unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup方法,例如可以用于数据库的重新连接

  • 相关阅读:
    linux 分析 目标文件 的命令
    bss,data,text,rodata,堆,栈,常量段
    Linux进程地址空间详解
    机器周期,指令周期,时钟周期,节拍与晶振
    银行家算法——C语言(11计科1班-孙鹏启——修正)
    bash —— bind ( 一个功能强大的组合键! Alt + . )
    【5002】排版问题
    【?】【7007】栈、模拟
    【u235】背单词
    【t076】竞赛排名
  • 原文地址:https://www.cnblogs.com/laijinquan/p/10005893.html
Copyright © 2011-2022 走看看