php 中序列化和json使用介绍


Posted in Javascript onJuly 08, 2013

【序列化的概念】

序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

将对象的状态信息转换为可以存储或传输的窗体的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。 对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。

【JSON的概念】

JSON,JavaScript Object Notation,一种更轻、更友好的用于接口(AJAX、REST等)数据交换的格式。 JSON是结构化数据串行化的文本格式,作为XML的一种替代品,用于表示客户端与服务器间数据交换有效负载的格式。它是从ECMAScript语言标准衍生而来的。JSON的设计目标是使它成为小的、轻便的、文本的,而且是JavaScript的一个子集。

【长度的比较】

如下一段代码,显示了对数组和对象编码后生成的字符串及其长度

class Foo {
    public $int = 1;
    public $bool = TRUE;
    public $array = array(array(1), 2 => 'test', 'string');
    public function test($flag) {
        echo $flag, 'test function for Foo <br />';
    }
    public static function output($str) {
        echo $str, '<br />';
    }
    public static function compare_serialize_and_json($data) {
        $serialize_str =  serialize($data);
        self::output('序列化后的值:' . $serialize_str . "; length=" .
            strlen($serialize_str));
        $json_str = json_encode($data);
        self::output('JSON后的值:' . $json_str . "; length=" . strlen($json_str));
    }
}
$test_data = array('wwww' => 0, 'phppan' => 1, 'com' => 2);
//序列化数组
echo '数组:<br />';
Foo::compare_serialize_and_json($test_data);
$foo = new Foo();
echo '对象:<br />';
Foo::compare_serialize_and_json($foo);

输出:

数组:
序列化后的值:a:3:{s:4:"wwww";i:0;s:6:"phppan";i:1;s:3:"com";i:2;}; length=52
JSON后的值:{"wwww":0,"phppan":1,"com":2}; length=29
对象:
序列化后的值:O:3:"Foo":3:{s:3:"int";i:1;s:4:"bool";b:1;s:5:"array";a:3:{i:0;
    a:1:{i:0;i:1;}i:2;s:4:"test";i:3;s:6:"string";}}; length=111
JSON后的值:{"int":1,"bool":true,"array":{"0":[1],"2":"test","3":"string"}}; length=63

很明显的长度区别,serialize在编码后大概是json的两倍。

原因:

•serialize后字符串包含了子串的长度,这可能是速度方面的优化,典型的空间换时间,但是它本身还是太重了。
•serialize有更加详细的类型区分,而json只有四种类型,并且是以简单的符号表示。

【速度的比较】

以代码说明问题,如下比较速度的代码:

$max_index = 10;
ini_set("memory_limit","512M");
$array = array_fill(0, 1000000, rand(1, 9999));
echo 'serialize:<br />';
$start = xdebug_time_index();
for ($i = 0;  $i < $max_index; $i++) {
    $str = serialize($array);
}
$end = xdebug_time_index();
echo $end - $start, '<br />';
echo 'json:<br />';
$start = xdebug_time_index();
for ($i = 0;  $i < $max_index; $i++) {
    $str = json_encode($array);
}
$end = xdebug_time_index();
echo $end - $start, '<br />';
unset($array, $str);

输出:

serialize:
9.5371007919312
json:
1.4313209056854

serialize的速度在大数据量的情况下比json差了快一个数量级。

从上面两点看,json不管是在速度还是在生成的字符串的大小上都比serialize要好,那为什么serialize还要存在呢? 原因在下面这个点:实现的功能。

【处理对象】

如下代码:

header("Content-type:text/html;charset=utf8");
class Foo {
     public function test($flag) {
        echo $flag, 'test function for Foo <br />';
    }
}
$foo = new Foo();
echo '反序列化测试:<br />';
$foo->test(1);
$serialize_str = serialize($foo);
$obj = unserialize($serialize_str);
$obj->test(2);
$foo->test(1);
$json_str = json_encode($foo);
$obj = json_decode($json_str);
$obj->test(2);
die();

输出:

反序列化测试:
1test function for Foo
2test function for Foo
1test function for Foo 
( ! ) Fatal error: Call to undefined method stdClass::test()

json无法处理对象方法等数据。

【使用范围】

•序列化使用serialize,特别是对象的存储。这是其存在的意义。
•与对象无关的数据存储可以使用json,如包含大量数字的数组等。只是当遇到这种情况,我们需要做的可能是重构数据库了。
•数据交换时使用JSON,这也是其定义所在。
•目前JSON是能用于UTF-8编码的数据。

Javascript 相关文章推荐
xss文件页面内容读取(解决)
Nov 28 Javascript
围观tangram js库
Dec 28 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
Mar 18 Javascript
js加载读取内容及显示与隐藏div示例
Feb 13 Javascript
简介JavaScript中的italics()方法的使用
Jun 08 Javascript
jQueryUI中的datepicker使用方法详解
May 25 Javascript
浅析BootStrap栅格系统
Jun 07 Javascript
JS 日期与时间戮相互转化的简单实例
Jun 22 Javascript
jQuery select自动选中功能实现方法分析
Nov 28 Javascript
js点击任意区域弹出层消失实现代码
Dec 27 Javascript
浅谈微信小程序列表埋点曝光指南
Oct 15 Javascript
JS轻量级函数式编程实现XDM二
Jun 16 Javascript
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
Jul 08 #Javascript
解析javascript 浏览器关闭事件
Jul 08 #Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
Jul 08 #Javascript
如何使用JS获取IE上传文件路径(IE7,8)
Jul 08 #Javascript
Jquery 模板数据绑定插件的使用方法详解
Jul 08 #Javascript
JS定义回车事件(实现代码)
Jul 08 #Javascript
使用javascript过滤html的字符串(注释标记法)
Jul 08 #Javascript
You might like
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
js 作用域和变量详解
2017/02/16 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
python开发之list操作实例分析
2016/02/22 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
python3.5安装python3-tk详解
2019/04/26 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
Python实现粒子群算法的示例
2021/02/14 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
升职自荐信
2013/11/28 职场文书
网络教育自我鉴定
2014/02/04 职场文书
药店主任岗位责任制
2014/02/10 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
党员评议自我评价
2015/03/03 职场文书