PHP 序列化

原创 2018年04月15日 22:19:30

什么是序列化

变量序列化:将变量转成可存储或可传输的字符串的过程,会保留变量的类型和结构。

变量反序列化:将序列化的字符串,还原成原始变量。

除了资源变量外,其他变量都可以序列化。

serialize()  

代码:

<?php

$arr = array(
	'db_host' => 'localhost',
	'db_name' => 'test',
	'db_user' => 'user',
	'db_pass' => 'root',
	'charset' => 'utf8',
);
$str = serialize($arr);   //数组序列化
echo $str;

unserialize()

代码:

<?php

$arr = array(
	'db_host' => 'localhost',
	'db_name' => 'test',
	'db_user' => 'user',
	'db_pass' => 'root',
	'charset' => 'utf8',
);
$str = serialize($arr);

$arrs = unserialize($str);
var_dump($arrs);

对象序列化

对象序列化的过程与其他变量一样

当序列化对象时,PHP将试图在序列化动作之前调用该对象的魔术方法__sleep(),这样就允许对象在被序列化之前做任何清除操作。

对象序列化的内容只能包含成员属性,不能包含常量、静态属性、静态方法、成员方法。

__sleep()方法:该方法先被调用,然后才能执行序列化。此功能可以用于清理对象,并返回一个包含对象中应被序列化的变量名称的数组。如果该方法没有返回任何内容,则null被序列化,并产生一个noitce级别错误。

__sleep()不能返回父类私有属性成员的名字。

上代码:

<?php
//定义最终的数据库工具类

final class Db{
	private $dbHost;
	private $dbUser;
	private $dbPass;
	public function __construct(array $conf){
		$this -> dbHost = $conf['dbHost'];
		$this -> dbUser = $conf['dbUser'];
		$this -> dbPass = $conf['dbPass'];
		$this -> connectDb();
	}
	private function connectDb(){
		if(!@mysql_connect($this->dbHost,$this->dbUser,$this->dbPass))
			die('false');
	}
        //返回需要的成员属性,不需要不写
        public function __sleep(){
                return array('dbHost','dbUser');
        }
}
$arr = array(
	'dbHost' => 'localhost',
	'dbUser' => 'root',
	'dbPass' => 'root',
);
$db = new Db($arr);

//对象序列化
$str = serialize($db);
echo $str;

对象反序列化

对象的反序列化过程,与其他变量一样

若凡序列化的变量是一个对象,在成功地重新构造对象之后,PHP会自动试图调用__wakeup()成员函数(如果存在的话)

unserialize() 会检查是否存在一个wakeup()方法,如果存在,则优先调用wakeup()方法,预先准备对象需要的资源。

__wakeup() 经常用在反序列化过程中,进行一些初始化操作,例如重新建立数据库连接,或执行其他初始化操作

上代码:

final class Db{
	private $dbHost;
	private $dbUser;
	private $dbPass;
	public function __construct(array $conf){
		$this -> dbHost = $conf['dbHost'];
		$this -> dbUser = $conf['dbUser'];
		$this -> dbPass = $conf['dbPass'];
		$this -> connectDb();
	}
	private function connectDb(){
		if(!@mysql_connect($this->dbHost,$this->dbUser,$this->dbPass))
			die('false');
	}
	public function __sleep(){
		return array('dbHost','dbUser');
	}
	public function __wakeup(){
		$this ->dbPass = 'root';
		$this ->dbName = 'test';
	}
}
$arr = array(
	'dbHost' => 'localhost',
	'dbUser' => 'root',
	'dbPass' => 'root',
);
$db = new Db($arr);

//对象序列化
$str = serialize($db);

//对象已经保存为字符串,直接反序列化即可。

$db = unserialize($str);
var_dump($db);

PHP5.5四种序列化性能对比

json_encode,serialize,igbinary,msgpack四种序列化方式,在PHP5.5方面性能表现如何?...
  • ugg
  • ugg
  • 2014-12-18 17:50:46
  • 8429

PHP serialize 序列化数组

PHP序列化数组用途: 较为复杂的数组数据变为字符串,方便数组存库操作。需要用的时候取出还原 PHP序列化数组用途: $test = array("a"=>0,"b"=>0,"c"=>0)...
  • liuhelong12
  • liuhelong12
  • 2015-10-06 18:35:50
  • 12197

PHP 与 JS 的另一种数据传递方式 序列化

从 PHP 3 开始为保存对象提供了一组序列化和反序列化的函数:serialize、unserialize,它可以方便的保存数据方便的做成CACHE,而存储体积也比XML要小的多,它结构与 JS 的 ...
  • lk188
  • lk188
  • 2010-01-02 00:50:00
  • 1373

PHP序列化反序列化serialize和unserialize函数

昨天网上看到一道面试题,如下: “类的属性可以序列化后保存到session中,从而以后可以恢复整个类,这要用到的函数是?” 我记得原来老师说过序列化函数是"serialize",查了下,果不其然,今天...
  • forLightWay
  • forLightWay
  • 2016-02-21 10:42:06
  • 17136

java 解析php序列化数据问题

有很多情况会涉及到php和java进行数据交换。一般情况是通过json数据格式去交换。但是对于那种比如:商城采用php进行开发,管理系统使用java语言开发,这其中就会涉及到数据交互,而正好php进行...
  • TOP__ONE
  • TOP__ONE
  • 2017-03-21 10:15:49
  • 1686

php 数组的序列化与反序列化

$aa = 数组; 1、把数组序列化:$data = serialize($aa); 2、把序列化的数据转回来:$list = unserialize($data);...
  • Developersq
  • Developersq
  • 2017-11-29 17:44:15
  • 306

php 序列化对象

习惯性借用手册里面的介绍: 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。序列化一个对象...
  • A757291228
  • A757291228
  • 2017-02-26 23:03:29
  • 493

php三维数组序列化,多维数组序列化

$a = array(     'a' => 'Apple',     'b' => 'banana',     'c' => 'Coconut' ); $s = serialize...
  • u011447828
  • u011447828
  • 2014-11-28 09:25:08
  • 706

PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析

本文实例讲述了PHP中SERIALIZE和JSON的序列化与反序列化操作区别。分享给大家供大家参考,具体如下: PHP中SERIALIZE和JSON序列化与反序列化区别是什么呢,对于这个问题我们...
  • qq_34341290
  • qq_34341290
  • 2016-11-29 16:55:04
  • 702

PHP基础教程十三之反射、对象序列化

本节讲解的内容 对象的克隆 对象的遍历 对象的序列化和反序列化 内置标准类的使用 traits的使用 类和对象的相关函数 PHP反射机制...
  • li741350149
  • li741350149
  • 2016-10-11 14:52:35
  • 1045
收藏助手
不良信息举报
您举报文章:PHP 序列化
举报原因:
原因补充:

(最多只允许输入30个字)