linux做网站教程,网站空间数据库上传,江西中国建设银行网站首页,云南建设注册考试中心网站序列化和反序列化的作用
1.序列化#xff1a;将对象转化成数组或者字符串的形式
2.反序列化#xff1a;将数组或字符串的形式转化为对象 为什么要进行序列化
这种数据形式中间会有很多空格#xff0c;不同人有不同的书写情况#xff0c;可能还会出现换行的情况
为此为了…序列化和反序列化的作用
1.序列化将对象转化成数组或者字符串的形式
2.反序列化将数组或字符串的形式转化为对象 为什么要进行序列化
这种数据形式中间会有很多空格不同人有不同的书写情况可能还会出现换行的情况
为此为了方便数据传输我们可以进行序列化操作将其变为一个字符串的形式进行传输
案例分析
我们在写PHP代码的时候会写到类这种数据形式
?php
class demotest{public $namexiaodi;public $sexman;public $age29;public $arrarray(abc,123,demo);
}
$ddnew demotest();
echo serialize($dd);
类似于这样原来的数据中就有很多的空格、换行、缩进等额外的数据这些数据没有用而且不同人写代码的习惯不同这些东西都会有差异而且不可避免在传输过程中可能会产生错误为此绕过将数据进行了序列化就会将传输的数据以统一的格式进行传输这样就比较规范而且减少出错的概率。
因此为了保证数据传递的效率和正确性我们可以把数据进行序列化后进行传输 序列化后各字段的含义 O表示的是序列化一个对象8是对象名称的长度3 表示有3个属性 s表示第一个属性是字符串类型 4 表示的是第一个属性的字符串长度 name是第一个属性的属性名称以分号结尾s表示对象的属性为字符串长度是6值为xiaodi后面的以此类堆......对象的属性相关信息都使用 {}括起来当然对于数组这样复杂的数据结构我们直接进行输出查看格式内容即可
序列化的内容是什么
序列化只序列化成员变量不序列化成员函数
案例分析
?php
class a{public $usernamexxxxxx;public $passwordxxxxxx;public function daying(){echo hello;}public function __destruct(){echo over;}
}
$aa new a();
echo serialize($aa); 我们在序列化的时候一个类中可能有属性也会有方法但是我们在序列化的时候只会序列化一个对象的属性不会序列化对象的方法。如图我们定义的类a中有username和password两个属性也有daying()和__destruct()两个方法我们可以看到在序列化后a对象中之序列化了两个属性为此两个方法并没有被序列化输出的over是因为触发了destruct()方法打印出来的结果与序列化无关ps主要是说明序列化只要是函数都不会被序列化)
反序列化--将序列化的数据还原成对象 将序列化的数据还原成对象
反序列化后的对象里面的值是反序列化里面的值决定与原来的预定义的值无关--通过反序列化我们可以修改原来类中属性的值
?php
class demotest{public $ahello;public function demo(){echo $this-a;}
}
$ddnew demotest();
echo(serialize($dd));
$eeO:8:demotest:1:{s:1:a;s:5:nihao;};
$ffurldecode($ee);
$gg unserialize($ff);
$gg-demo(); 本来在demodest中a的值是hello但是我们通过反序列化将a的值改为nihao后输出的中值改为了nihao
公有属性和私有属性
在进行反序列化的过程中对用私有属性受保护的属性公有属性来说其反序列化后的结果是不相同。具体结果如图所示
?php
class demo{public $namedemo;private $sexman;protected $age18;}
$dnew demo();
echo serialize($d);
? 对于一个对象来说它的公有属性序列化后的属性名还是原来的字符串
对于一个对象来说它的私有属性序列化后的属性名是%00类名%00属性名
对于一个对象来说它的受保护的属性序列化后的属性名是 %00*%00属性名
写在最后
如有错误请及时指出感谢