今天就跟大家聊聊有关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中序列化与反序列化的区别是什么