PHP中序列化与反序列化的区别是什么

  介绍

今天就跟大家聊聊有关PHP中序列化与反序列化的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。


序列化函数原型如下:

string  serialize  (, mixed  value 美元)

先看下面的例子:

class  CC  {   public  $数据;   private 通过美元;   public  function  __construct(元数据,通过美元),{=$ this→data 元数据;=$ this→pass 通过美元;   }   }   $ number =, 34;   时间=美元str  & # 39; uusama& # 39;;=$ bool 真实;   $ null =,空;   arr 美元;=,阵列(& # 39;一个# 39;,=祝辞,1,& # 39;b # 39;,=祝辞,2);   $ cc =, new  CC (& # 39; uu # 39;,,真的);   var_dump(序列化(数字)美元);   var_dump(序列化(str)美元);   var_dump(序列化($ bool));   var_dump(序列化(零美元));   var_dump(序列化(arr)美元);   var_dump(序列化(cc)美元);

输出结果为:

字符串(5)“我:34;“
字符串(13)“s: 6:“uusama"“
字符串(4)“b: 1;“
字符串(2)“N;“
字符串(30)“答:2:{:1:“a"我:1;销售:1:“b";我:2;}“
字符串(52)“O: 2:“CC" 2: {: 4:“data"销售:2:“uu";销售:8:“CC pass"; b: 1;}“

所以序列化对于不同类型得到的字符串格式为:

<李>

,<代码>字符串:s:大小:价值;

<李>

,<代码>整数:我:价值;

<李>

<代码> Boolean  :b:价值;(保存1或0)

<李>

<代码> Null  :N;

<李>

<代码> Array  :答:大小:{键定义;值定义;(重复元素)}

<李>

<代码> Object  :O: strlen(对象名称):对象名称:对象大小:{年代:strlen(属性名):属性名称:财产的定义;(每个属性重复)}

序列化对象

从上面的例子中我们可以看出序列化对象的时候,只会保存属性值。

<李>

那么对象中的常量会不会保存呢?

<李>

如果是继承,父类的变量会不会保存呢

class  CB  {   public  CB_data 美元;=,& # 39;cb # 39;;   }   class  CC  extends  CB  {   const  SECOND =, 60;   public  $数据;   private 通过美元;   public  function  __construct(元数据,通过美元),{=$ this→data 元数据;=$ this→pass 通过美元;   }   public  function  setPass(通过美元),{=$ this→pass 通过美元;   }   }   $ cc =, new  CC (& # 39; uu # 39;,,真的);   var_dump(序列化(cc)美元);

输出结果为:

字符串(75)“O: 2:“CC" 3: {: 4:“data"销售:2:“uu";销售:8:“CC pass"; b: 1;销售:7:“CB_data"销售:2:“cb"}“

显然,序列化对象时,不会保存常量的值。对于父类中的变量,则会保留。

对象序列化自定义

在序列化对象的时候,对于对象中的一些敏感属性,我们不需要保存,这又该如何处理呢?

当调用<代码>序列化()函数序列化对象时,该函数会检查类中是否存在一个魔术方法<代码> __sleep()> public  array  __sleep  (, void )

该方法返回一个包含对象中所有应被序列化的变量名称的数组

<李>

该方法返回一个包含对象中所有应被序列化的变量名称的数组

<李>

该方法未返回任何内容,则零被序列化,并产生一个<代码> E_NOTICE> <李>

<代码> __sleep() 不能返回父类的私有成员的名字。这样做会产生一个<代码> E_NOTICE> 序列化代码接口来替代。

<李>

常用于保存那些大对象时的清理工作,避免保存过多冗余数据

看下面的例子:

class 用户{   const  SITE =, & # 39; uusama& # 39;;      public 美元的用户名;   public 美元昵称;   private 美元密码;      public  function  __construct(用户名、美元,美元的昵称,密码)美元   {=$ this→username  $用户名;=$ this→nickname  $昵称;=$ this→password  $密码;   }//,重载序列化调用的方法   public  function  __sleep ()   {//,返回需要序列化的变量名,过滤掉密码变量   return 数组(& # 39;用户名# 39;,,& # 39;昵称# 39;);   }   }   user 美元;=,new 用户(& # 39;uusama& # 39;,, & # 39; uu # 39;,, & # 39; 123456 & # 39;);   var_dump(序列化(用户)美元);

PHP中序列化与反序列化的区别是什么