PHP多种序列化/反序列化的方法 json_encode json_decode
序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
1. serialize和unserialize函数
这两个是序列化和反序列化PHP中数据的常用函数。
01
|
<?php
|
02
|
03
|
$a = array ( 'a' => 'Apple' , 'b' => 'banana' , 'c' => 'Coconut' );
|
04
|
|
05
|
//序列化数组
|
06
|
$s = serialize( $a );
|
07
|
echo $s ;
|
08
|
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}
|
09
|
10
|
echo '<br /><br />' ;
|
11
|
12
|
//反序列化
|
13
|
$o = unserialize( $s );
|
14
|
15
|
print_r( $o );
|
16
|
//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut )
|
17
|
|
18
|
?>
|
当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
1
|
$obj = array ();
|
2
|
//序列化
|
3
|
$s = base64_encode (serialize( $obj ));
|
4
|
//反序列化
|
5
|
$original = unserialize( base64_decode ( $s ));
|
但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。
01
|
//定义一个用来序列化对象的函数
|
02
|
03
|
function my_serialize( $obj )
|
04
|
{
|
05
|
return base64_encode (gzcompress(serialize( $obj )));
|
06
|
}
|
07
|
08
|
//反序列化
|
09
|
function my_unserialize( $txt )
|
10
|
{
|
11
|
return unserialize(gzuncompress( base64_decode ( $txt )));
|
12
|
}
|
2. json_encode 和 json_decode
使用JSON格式序列化和反序列化是一个不错的选择:
- 使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。
- JSON格式是可读的。
- JSON格式比serialize返回数据结果小。
- JSON格式是开放的、可移植的。其他语言也可以使用它。
01
|
$a = array ( 'a' => 'Apple' , 'b' => 'banana' , 'c' => 'Coconut' );
|
02
|
|
03
|
//序列化数组
|
04
|
$s = json_encode( $a );
|
05
|
echo $s ;
|
06
|
//输出结果:{"a":"Apple","b":"banana","c":"Coconut"}
|
07
|
08
|
echo '<br /><br />' ;
|
09
|
10
|
//反序列化
|
11
|
$o = json_decode( $s );
|
在上面的例子中,json_encode输出长度比上个例子中serialize输出长度显然要短。
3. var_export 和 eval
var_export 函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。
01
|
$a = array ( 'a' => 'Apple' , 'b' => 'banana' , 'c' => 'Coconut' );
|
02
|
|
03
|
//序列化数组
|
04
|
$s = var_export( $a , true);
|
05
|
echo $s ;
|
06
|
//输出结果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', )
|
07
|
08
|
echo '<br /><br />' ;
|
09
|
10
|
//反序列化
|
11
|
eval ( '$my_var=' . $s . ';' );
|
12
|
13
|
print_r( $my_var );
|
4. wddx_serialize_value 和 wddx deserialize
wddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。
01
|
$a = array ( 'a' => 'Apple' , 'b' => 'banana' , 'c' => 'Coconut' );
|
02
|
03
|
//序列化数组
|
04
|
$s = wddx_serialize_value( $a );
|
05
|
echo $s ;
|
06
|
07
|
//输出结果(查看输出字符串的源码):<wddxPacket version='1.0'><header/><data><struct><var name='a'><string>Apple</string></var><var name='b'><string>banana</string></var><var name='c'><string>Coconut</string></var></struct></data></wddxPacket>
|
08
|
09
|
echo '<br /><br />' ;
|
10
|
11
|
//反序列化
|
12
|
$o = wddx_deserialize( $s );
|
13
|
14
|
print_r( $o );
|
15
|
//输出结果:Array ( [a] => Apple [b] => banana 1 => Coconut )
|
可以看出,XML标签字符较多,导致这种格式的序列化还是占了很多空间。
小结
上述所有的函数在序列化数组变量时都能正常执行,但运用到对象就不同了。例如json_encode序列化对象就会失败。反序列化对象时,unserialize和eval将有不同的效果。
PHP多种序列化/反序列化的方法 json_encode json_decode相关推荐
- PHP多种序列化/反序列化的方法 (转载)
1. serialize和unserialize函数 这两个是序列化和反序列化PHP中数据的常用函数. <?php$a = array('a' => 'Apple' ,'b' => ...
- PHP多种序列化/反序列化的方法(serialize和unserialize函数)
serialize和unserialize函数这两个是序列化和反序列化PHP中数据的常用函数.<?php$a = array('a' => 'Apple' ,'b' => 'bana ...
- php 序列化储存和转化 json_encode() json_decode($q,true)
序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 例如:当需要数据库只有一个 ...
- php+反序列化方法,PHP序列化反序列化的方法详解
在一些开源的php源代码中,我们经常看到一些配置文件里面存放的是一些类似带有格式的变量名称和值.刚开始还不明白这个是怎么回事儿.后来才知道这个是为了将一个复杂(也可能并不那么复杂)的数据结构转换成一个 ...
- Redis Template使用append方法不起作用的解决办法以及序列化/反序列化的解释
今天使用Redis Template进行测试发现的问题, 遇到这个错 org.springframework.data.redis.serializer.SerializationException: ...
- php json字符串序列化,JSON序列化与反序列化实现方法(附代码)
这次给大家带来JSON序列化与反序列化实现方法(附代码),JSON序列化与反序列化实现的注意事项有哪些,下面就是实战案例,一起来看一下. 一.JSON简介 JSON(JavaScript Object ...
- 程序验证Jackson反序列化的规则、Jackson序列化与反序列化关键方法程序详细分析
目录 0. 为什么要做这个分析 1. Jackson反序列化时,无参构造.有参构造的执行顺序[附程序截图] 1.1 没有无参构造时: 1.2 无参构造和有参构造方法都有的时候先走无参构造: 2. Ja ...
- 在.net中序列化读写xml方法的总结(转载)
阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数 ...
- Dubbo的多种序列化算法
RPC 框架需要通过网络通信实现跨 JVM 的调用.既然需要网络通信,那就必然会使用到序列化与反序列化的相关技术,Dubbo 也不例外. 1 JDK序列化操作 1.1 实现 Serializable ...
最新文章
- c语言数组在栈上的分配,彻底弄懂为什么不能把栈上分配的数组(字符串)作为返回值...
- java底层原理书籍_阿里面试题:Java中this和super关键字的底层实现原理
- android 单例的作用,Android中单例模式的几个坑
- 让Windows XP系统快上几倍的三个绝招
- c语言银行卡管理系统程序设计报告,C语言课程设计报告(银行账户信息管理系统).doc...
- 找出不是两个数组共有的元素(学习去重复算法)
- 一道简单的但是经典的动态规划题目
- 将类似 Fri Jun 14 2019 00:00:00 GMT+0800 (中国标准时间) 的日期转化为 XXXX-XX-XX的形式...
- 怎么有效的管理微信群?分享3点有用的经验
- 十六、响应式布局--媒体查询
- 利用ckplayer浏览器在线播放视频并获取视频预览图方法
- 4245. 【五校联考6day2】er
- 怎样在word中打印框选对√
- 二元函数最大最小值定理证明_Von Neumann最小最大值定理的归纳法证明
- 北京跑步入夏--妞妞跑步长大
- java驱动sikuli打开虎牙直播
- 测试人员绩效考核KPI指标
- Vue前端模板框架--vue-admin-template
- oppoa5系统服务器是什么,买OPPO A5还是OPPO A3?OPPO A3和OPPO A5区别对比
- 信息时代,书香更宜人
热门文章
- java web六:tomcat其他小问题
- 网络丢包问题排查总结
- H3C 交换机升级说明
- Linux磁盘管理----分区格式化挂载fdisk、mkfs、mount
- gluPerspective和gluLookAt的关系
- flask+sqlite3+echarts3+ajax 异步数据加载
- Tensorflow 读取XML文件内容并对图片等比例缩放
- MATLAB 结构型变量
- 使用SpringBoot框架和SpringSecurity框架整合出现because its MIME type ('text/html') is not executable
- 大工计算机基础在线作业答案,大工11春《计算机文化基础》在线作业及答案(国外英文资料).doc...