前言
序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
将对象的状态信息转换为可以存储或传输的窗体的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能 够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也 与可访问性规则无关。 对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。 如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。
serialize和unserialize函数
这两个是序列化和反序列化PHP中数据的常用函数。有利于存储或传递 PHP 的值,同时不丢失其类型和结构。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
$a = array ( 'a' => 'Apple' , 'b' => 'banana' , 'c' => 'Coconut' );
//序列化数组
$s = serialize( $a );
echo $s ;
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}
echo '<br /><br />' ;
//反序列化
$o = unserialize( $s );
print_r( $o );
//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut )
?>
|
当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode
和base64_decode
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
$obj = array ();
//序列化
$s = base64_encode (serialize( $obj ));
//反序列化
$original = unserialize( base64_decode ( $s ));
但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。
//定义一个用来序列化对象的函数
function my_serialize( $obj )
{
return base64_encode (gzcompress(serialize( $obj )));
}
//反序列化
function my_unserialize( $txt )
{
return unserialize(gzuncompress( base64_decode ( $txt )));
}
|
json_encode 和 json_decode
使用JSON格式序列化和反序列化是一个不错的选择:
使用json_encode
和json_decode
格式输出要serialize
和unserialize
格式快得多。
(1) JSON
格式是可读的。
(2) JSON
格式比serialize
返回数据结果小。
(3) JSON
格式是开放的、可移植的。其他语言也可以使用它。
1
2
3
4
5
6
7
8
9
10
11
|
$a = array ( 'a' => 'Apple' , 'b' => 'banana' , 'c' => 'Coconut' );
//序列化数组
$s = json_encode( $a );
echo $s ;
//输出结果:{"a":"Apple","b":"banana","c":"Coconut"}
echo '<br /><br />' ;
//反序列化
$o = json_decode( $s );
|
在上面的例子中,json_encode
输出长度比上个例子中serialize
输出长度显然要短。需要注意的是json_encode
不能序列化对象。
总结
以上就是这篇文章的全部内容,希望大家能够喜欢并且给大家带来帮助。如果有问题可以留言讨论。