PHP serialize 和 unserialize
今天用到PHP的序列化和反序列化,顺便做了个测试。官方手册信息在这里和这里。
我使用的是PHP 5.2.4.4,操作系统是Windows XP,测试总结,如下:
问题
print unserialize(serialize(false)).$newline;//bug???,这个没有输出(见测试代码输出中的boolean节)print unserialize(serialize(NULL)).$newline;//bug???,这个没有输出(见测试代码输出中的NULL节)- 对中文的处理要注意(见测试代码输出中的string节)
- 对float,double的处理要注意(见测试代码输出中的float,double节)
- 对object的序列化不包含方法(见测试代码输出中的object节)
测试代码
<?php
$newline = "<br/>";
print "--- boolean ---";
print $newline;
//boolean
print serialize(true).$newline;
print unserialize(serialize(true)).$newline;
print $newline;
print serialize(false).$newline;
print unserialize(serialize(false)).$newline;//bug???
print $newline;
print "--- integer ---";
print $newline;
//integer
print serialize(1).$newline;
print unserialize(serialize(1)).$newline;
print $newline;
print serialize(-1).$newline;
print unserialize(serialize(-1)).$newline;
print $newline;
print "--- float,double ---";
print $newline;
//float,double
print serialize(1.23).$newline;
print unserialize(serialize(1.23)).$newline;
print $newline;
print serialize(-1.23).$newline;
print unserialize(serialize(-1.23)).$newline;
print $newline;
print "--- string ---";
print $newline;
//string
print serialize("hello").$newline;
print unserialize(serialize("hello")).$newline;
print $newline;
print serialize("你好").$newline;
print unserialize(serialize("你好")).$newline;
print $newline;
print "--- array ---";
print $newline;
//array
print serialize(array()).$newline;
print serialize(array(1=>true,3=>1.23)).$newline;
print serialize(array(1=>false,
"foos"=>array(1=>"foo1",2=>"foo2"))).$newline;
print $newline;
print "--- object ---";
print $newline;
//object
class Foo{
var $hi = "hello";
var $name = "world";
function hello(){
print $this->hi." ".$this->name;
}
}
print serialize(new Foo).$newline;
print $newline;
print "--- resource ---";
print $newline;
//resource
print "unsupport".$newline;
print $newline;
print "--- NULL ---";
print $newline;
//NULL
print serialize(NULL).$newline;
print unserialize(serialize(NULL)).$newline;//bug???
print $newline;
print "--- others ---";
print $newline;
//0
print serialize(0).$newline;
print serialize((float)0).$newline;
print serialize((double)0).$newline;
print $newline;
//octal
print serialize(0123).$newline;
print unserialize(serialize(0123)).$newline;
//hexadecimal
print serialize(0x1A).$newline;
print unserialize(serialize(0x1A)).$newline;
print $newline;
//NAN,INF
//NAN The constant NAN is reported as 0 on Windows build
//see http://bugs.php.net/bug.php?id=42143
print serialize(NAN).$newline;
print unserialize(serialize(NAN)).$newline;
print serialize(INF).$newline;
print unserialize(serialize(INF)).$newline;
?>
测试代码输出:
--- boolean ---
b表示boolean,1表示true
b:1;
1
b:0;
<---这里应该有输出,可是没有
--- integer ---
i表示integer,1表示值为1
i:1;
1
i:-1;
-1
--- float,double ---
注意原来是1.23
d表示double同float,后面表示值
d:1.229999999999999982236431605997495353221893310546875;
1.23
d:-1.229999999999999982236431605997495353221893310546875;
-1.23
--- string ---
s表示string,5表示字符串的长度,后面表示实际的字符串
s:5:"hello";
hello
注意原来的你好成了乱码,这里我把乱码替换掉了
s:6:"变成了乱码";
变成了乱码
--- array ---
a表示array,0表示数组长度
a:0:{}
a:2:{i:1;b:1;i:3;d:1.229999999999999982236431605997495353221893310546875;}
a:2:{i:1;b:0;s:4:"foos";a:2:{i:1;s:4:"foo1";i:2;s:4:"foo2";}}
--- object ---
O(大写)表示array,3表示Foo的长度,2表示数组的长度
这里可以窥探PHP是如何序列化对象的
O:3:"Foo":2:{s:2:"hi";s:5:"hello";s:4:"name";s:5:"world";}
--- resource ---
unsupport
--- NULL ---
N;
<---这里应该有输出,可是没有
--- others ---
integer 0
i:0;
float 0
d:0;
double 0
d:0;
看不出是八进制了
i:83;
83
看不出是十进制了
i:26;
26
d:0;
0
d:INF;
INF

