PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
本文实例讲述了PHP中SERIALIZE和JSON的序列化与反序列化操作区别。分享给大家供大家参考,具体如下:
PHP中SERIALIZE和JSON序列化与反序列化区别是什么呢,对于这个问题我们可以和小编一起来看看,具体的操作细节如下所示。
在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢?
假设一个对象和一个数组:
$web = new stdClass; $web->site = 'tantengvip'; $web->owner = 'tuntun'; $web->age = 5; //和 $web = array(); $web['site'] = 'tantengvip'; $web['owner'] = 'tuntun'; $web['age'] = 5;
对它们分别用serialize函数和unserialize函数进行序列化和反序列化,看看打印结果分别是什么,如下:
使用serialize方式:
var_dump(serialize($web)); var_dump(unserialize(serialize($web))); var_dump(json_encode($web)); var_dump(json_decode(json_encode($web)));
结果:
string 'O:8:"stdClass":3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=87) object(stdClass)[127] public 'site' => string 'tantengvip' (length=10) public 'owner' => string 'tuntun' (length=6) public 'age' => int 5 string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46) object(stdClass)[127] public 'site' => string 'tantengvip' (length=10) public 'owner' => string 'tuntun' (length=6) public 'age' => int 5
使用json方式:
var_dump(serialize($web)); var_dump(unserialize(serialize($web))); var_dump(json_encode($web)); var_dump(json_decode(json_encode($web),true));
结果:
string 'a:3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=74) array (size=3) 'site' => string 'tantengvip' (length=10) 'owner' => string 'tuntun' (length=6) 'age' => int 5 string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46) array (size=3) 'site' => string 'tantengvip' (length=10) 'owner' => string 'tuntun' (length=6) 'age' => int 5
我们发现,对于前面定义的这样一个对象或数组,用serialize和json进行序列化,反序列化回来的结果和原来是一样的,并没有什么区别,除了序列化的格式不同而已.
那么它们到底有何区别?以下文字总结很好,就不自己加以说明了,可以写代码验证。
使用json序列化和反序列化
优势:
变量序列化后依然可读
可以给其他系统使用,因为JSON格式是标准的
劣势:
只对UFT-8的数据有效,其他编码可能不能很好工作
只对stdClass类的示例有效
使用serialize方式序列化和反序列化
优势:
允许非UTF-8的变量
支持除了stdClass 示例外的其他实例
劣势:
编码后的文本对人来说是不可读的
无法被其他语言的系统引用
好,写个代码看看:
class Test { private $pri = 'pri'; public $class = 'Test'; public function __construct() { $this->class = 'Test construct'; $this->pri = 'pri construct'; } } $test = new Test(); var_dump(serialize($test)); var_dump(unserialize(serialize($test))); var_dump(json_encode($test)); var_dump(json_decode(json_encode($test)));
结果:
string 'O:4:"Test":2:{s:9:"�Test�pri";s:13:"pri construct";s:5:"class";s:14:"Test construct";}' (length=86) object(Test)[127] private 'pri' => string 'pri construct' (length=13) public 'class' => string 'Test construct' (length=14) string '{"class":"Test construct"}' (length=26) object(stdClass)[127] public 'class' => string 'Test construct' (length=14)
我们发现,json序列化和反序列化丢失了类中的私有成员变量,而serialize序列化和反序列化只要是类的变量都可以,但是类的成员方法都无法进行序列化和反序列化。
在一般情况,还是使用json比较好,因为json是跨平台的通用格式,除了json,用xml也比较好。那在什么时候使用serialize方式呢?
在对一个类进行serialize反序列化的时候会默认调用魔术方法__wakeUp(),这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。那就是另外一个问题了,这里不做深究了
希望本文所述对大家PHP程序设计有所帮助。
更多PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析相关文章请关注PHP中文网!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP数据处理技巧:如何使用serialize和unserialize函数实现数据序列化与反序列化序列化和反序列化是在计算机科学中常用的数据处理技巧之一。在PHP中,我们可以使用serialize()和unserialize()函数来实现数据的序列化和反序列化操作。本文将为您详细介绍如何使用这两个函数,并提供相关代码示例。一、什么是序列化和反序列化在计算机编

Flexjson是一个轻量级库,用于序列化和反序列化Java对象>和来自JSON格式。我们可以使用JSONSerializer类的serialize()方法序列化对象列表。此方法可以对目标实例执行浅层序列化。我们需要将列表类型的对象列表作为参数传递给serialize()方法。语法publicStringserialize(Objecttarget)示例importflexjson.JSONSerializer;importjava.util.*;publicclassJsonSerial

C++函数库序列化和反序列化指南序列化:创建输出流并将其转换为存档格式。将对象序列化到存档中。反序列化:创建输入流并将其从存档格式恢复。从存档中反序列化对象。实战示例:序列化:创建输出流。创建存档对象。创建对象并将其序列化到存档中。反序列化:创建输入流。创建存档对象。创建对象并从存档中反序列化。

序列化对Java性能的影响:序列化过程依赖于反射,会显着影响性能。序列化需要创建字节流存储对象数据,导致内存分配和处理成本。序列化大对象会消耗大量内存和时间。序列化后的对象在网络上传输时会增加负载量。

@JsonPropertyOrder是在类级别使用的注释。它采用字段列表作为属性,该列表定义字段在对象JSON序列化生成的字符串中出现的顺序。可以首先序列化注释声明中包含的属性(按定义的顺序),然后序列化定义中未包含的任何属性。语法public@interfaceJsonPropertyOrder示例importcom.fasterxml.jackson.core.*;importcom.fasterxml.jackson.databind.*;importcom.fasterxml.jac

接口无法直接序列化,抽象类可以序列化但前提是不包含非静态、非瞬态字段或覆盖writeObject()和readObject()方法,具体实例可通过实现接口的具体类或覆盖writeObject()和readObject()方法的抽象类实现。

GoLang函数类型可通过encoding/gob包实现序列化和反序列化。序列化:注册自定义类型并使用gob.NewEncoder将函数类型编码为字节数组。反序列化:使用gob.NewDecoder从字节数组反序列化函数类型。

Flexjson是一个轻量级库,用于将Java对象序列化为JSON格式以及反序列化为JSON格式。我们还可以使用JSONSerializer类的serialize()方法来序列化Map,它对目标实例执行浅层序列化。语法publicStringserialize(Objecttarget)示例importflexjson.JSONSerializer;importjava.util.*;publicclassJsonSerializeMapTest{ publ
