php 反序列化知识
什么是php序列化?
php序列化是将 对象,字符串,数组,常见数据类型转换为一种可存储的字符串格式类型。
平时最常见的就是将对象Object进行序列化,在php序列化中使用serialize() 函数进行序列化,unserizlize()函数进行反序列化。
如下,一个简单的demo1对象序列化及反序列化后的结果
代码
<?php
class demo1{
public $k="k1";
public $a1;
public $num=1;
public function f1($var){
echo $var;
}
}
$c2=new demo1();
echo(serialize($c2));//序列化demo1对象
echo "\n";
var_dump(unserialize(serialize($c2)));//反序列化
?>
输出
对整型,字符串,数组进行序列化
<?php
$Int=999;
echo(serialize($Int));//序列化整形
echo "\n";
$str1="test";
echo(serialize($str1)); //序列化字符串
echo "\n";
$arr=[10,20.1,"30"];
echo(serialize($arr));//序列化数组
?>
输出
在上面的序列化结果中 i:999 ,i 表示Integer类型,数值是999;s:4:“test” 中,s表示是字符串类型,4是表示字符串值长度为4,最后的"test" 是字符串的值。
数组序列化 a:3:{i:0;i:10;i:1;d:20.100000000000001;i:2;s:2:“30”;},开头的a表示是array数组类型,3 表示数组长度为3,i:0;i:10; 这里依次表示为数组下标索引为0,Integer类型值是10
在demo1对象序列化结果中:O:5:“demo1”:3:{s:1:“k”;s:2:“k1”;s:2:“a1”;N;s:3:“num”;i:1;},开头O表示是一个对象类型Object,5表示对象类名长度,demo1是类名,3表示对象类中有3个成员属性。大括号 {}里面依次是成员属性的表示,再看s:1:“k”;s:2:“k1”;这一部分对一个成员属性的格式描述 ,s:1:“k” 这一部分描述的是数据类型及成员属性的变量名,s:2:“k1” 这一部分描述的是成员属性的值部分。
s:2:“a1”;N;成员属性中由于变量a1没有赋初值,以N表示(Null)
需要注意的是对象中的function函数f1() 并没有被反序列化
在类对象进行序列化时,不同的权限修饰符修饰成员属性会有不同的序列化结果
<?php
class demo1{
public $k="k1";
private $a1;
protected $num=1;
public function f1($var){
echo $var;
}
}
$c2=new demo1();
//var_dump(base64_encode(serialize($c2)));
var_dump((serialize($c2)));//序列化demo1对象
?>
运行结果
不同权限修饰符修饰的结果
当类对象中变量不同修饰符序列化后的变化
权限 序列化变量名
public 变量名; "变量名" (正常不变)
private 变量名; "%00类名%00变量名"
protected 变量名; "%00*%00变量名"
在很多下情况需要注意如果使用echo进行输出类对象的序列化输出,默认会把%00空格吃掉,在丢失%00空格的情况下反序列化会失败
不同数据类型的序列化后结果格式
序列化后的结构为
类型:Integer 格式: i:值
类型:String 格式: s:字符串变量名长度:变量名
类型:Boolean 格式: b:1或者0
类型:array 格式: a:数组长度:{(索引类型:下标索引);(类型:值)}
类型:Object 格式: O:对象类名长度:类名:成员属性数量:{此处根据不同数据类型描述赋值}