JavaScript must be enabled in order for you to view this page. However, it seems JavaScript is either disabled or not supported by your browser. To view this page, enable JavaScript by changing your browser options, then Try again! .

PHP serialize 和 unserialize

by solo L2008-04-24T21:08:00Z,tag:PHP

今天用到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
Copyright © SoloL.org 冀ICP备06003230号