PHP中 json_encode 和 serialize 区别
2019-02-11| 程成| 468| 0| PHP技术

(1)serialize主要用于php的序列化,存储到文件或者数据库中,json_encode 也是序列化,但是 主要用于与其他语言比如js进行交互使用,对于传输来说,json有许多优点。


(2)在显示上,serialize序列化的字符串包含额外的内容,这是值的类型和长度的编码


(3)在进行 json_decode解码的时候需要注意,如果是序列化的数值型数组,那么json_decode 可以还原为原来的数组(数值型数组哦),但是,如果序列化的是关联数组(或者对象),那么由于json_decode无法判断是关联数组还是对象(我们可以理解为这两个长的像无法区分),所以json_decode会默认还原解析为stdclass的对象,如果加了true才解析为关联数组


(4)json_encode不能序列化对象的成员方法,代码如下:

  serialize序列化之后,反序列化的数据,可以重新调用成员方法,但是json_decode不行,会报错,具体可以测试、


(5)__sleep和__wakeUp魔术方法

    当一个对象被串行化,PHP会调用__sleep方法(如果存在的话,并且进行操作,比如对变量赋值). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值. 如果没有__sleep方法,PHP将保存所有属性.

      在程序执行前,serialize() 函数会首先检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用, 然后才执行串行化(序列化)操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组(必须返回。与之相反,unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup方法,例如可以用于数据库的重新连接


    (6) 性能区别,PHP7.0环境

    json_encode、json_decode、serialize、unserialize 各执行1000次。统计执行时间后得到数据:

json : 190 
serialize : 257 
json_encode : 0.09922194480896 
json_decode : 0.081702947616577 
serialize : 0.032901048660278 
unserialize : 0.064083099365234 
DONE.

json_encode和json_decode的效率并没有比serialize和unserialize的效率高,在反序列化的时候性能相差两倍左右。



测试代码如下:


<?php
$target = array (
    'name' => '全能头盔',
    'quality' => 'Blue',
    'ti_id' => 21302,
    'is_bind' => 1,
    'demand_conditions' =>
        array (
            'HeroLevel' => 1,
        ),
    'quality_attr_sign' =>
        array (
            'HeroStrength' => 8,
            'HeroAgility' => 8,
            'HeroIntelligence' => 8,
        ),
);
$json = json_encode($target);
$seri = serialize($target);
echo "json :\t\t" . strlen($json) . "\r\n";
echo "serialize :\t" . strlen($seri) . "\r\n\r\n";
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
    json_encode($target);
}
$etime = microtime(true);
echo "json_encode :\t" . ($etime - $stime) . "\r\n";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
    json_decode($json);
}
$etime = microtime(true);
echo "json_decode :\t" . ($etime - $stime) . "\r\n\r\n";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
    serialize($target);
}
$etime = microtime(true);
echo "serialize :\t" . ($etime - $stime) . "\r\n";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
    unserialize($seri);
}
$etime = microtime(true);
echo "unserialize :\t" . ($etime - $stime) . "\r\n\r\n";
echo 'DONE.';



×
作者:程成
QQ:492245711