大家好,今天给各位分享php序列化数据的一些知识,其中也会对php的序列化操作生成的哪种格式进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
在PHP编程中,序列化数据是一项非常重要的操作。它能够将复杂的数据结构转换为字符串形式,便于数据存储、传输和解析。本文将深入解析PHP序列化数据的相关知识,并分享一些实用的应用技巧。
一、什么是序列化?
序列化(Serialization)是将数据结构或对象状态转换成可以存储或传输的格式的过程。在PHP中,序列化通常用于将对象或数组转换成JSON或XML格式的字符串,以便在网络上传输或存储。
二、PHP序列化常用方法
PHP提供了多种序列化方法,以下是几种常用的方法:
1. serialize():将一个对象或数组序列化为JSON格式的字符串。
2. unserialize():将JSON格式的字符串反序列化为对象或数组。
3. json_encode():将一个PHP值(通常是数组或对象)转换成JSON字符串。
4. json_decode():将JSON字符串转换成PHP值(通常是对象或数组)。
下面是一个简单的示例:
```php
$array = array('name' => '张三', 'age' => 20);
$json = json_encode($array);
echo $json; // 输出: {"
PHP序列化数据存储在数据库中使用json还是serialize好
1)空间的比较
serialize在编码后大概是json的1.5倍。
原因:
serialize后字符串包含了子串的长度,这可能是速度方面的优化,但是测试结果不尽人意。
serialize有更加详细的类型区分,而json只有四种类型,并且是以简单的符号表示。
2)速度的比较
在较小数据的情况下, serialize比json快数量级。
在大数据量的情况下,json比serialize稍微差一点
3)处理对象
json无法处理对象方法等数据。
4)使用范围
在前后端交互一般都使用JSON,目前JSON只支持UTF-8编码的数据。
序列化使用serialize,特别是对象的存储。这是其存在的意义。
与对象无关的数据存储可以使用json,如包含大量数字的数组等。
这篇博客概括满全面:
php 中序列化和json使用介绍
【序列化的概念】
序列化是将对象状态转换为可保持或可传输的格式的过程与序列化相对的是反序列化它将流转换为对象这两个过程结合起来可以轻松地存储和传输数据
将对象的状态信息转换为可以存储或传输的窗体的过程在序列化期间对象将其当前状态写入到临时或持久性存储区以后可以通过从存储区中读取或反序列化对象的状态重新创建该对象
通常对象实例的所有字段都会被序列化这意味着数据会被表示为实例的序列化数据这样能够解释该格式的代码有可能能够确定这些数据的值而不依赖于该成员的可访问性类似地反序列化从序列化的表示形式中提取数据并直接设置对象状态这也与可访问性规则无关对于任何可能包含重要的安全性数据的对象如果可能应该使该对象不可序列化如果它必须为可序列化的请尝试生成特定字段来保存不可序列化的重要数据如果无法实现这一点则应注意该数据会被公开给任何拥有序列化权限的代码并确保不让任何恶意代码获得该权限
【JSON的概念】
JSON Javascript Object Notation一种更轻更友好的用于接口(AJAX REST等)数据交换的格式 JSON是结构化数据串行化的文本格式作为XML的一种替代品用于表示客户端与服务器间数据交换有效负载的格式它是从ECMAscript语言标准衍生而来的 JSON的设计目标是使它成为小的轻便的文本的而且是Javascript的一个子集
【长度的比较】
如下一段代码显示了对数组和对象编码后生成的字符串及其长度
复制代码代码如下: class Foo{ public$int=; public$bool= TRUE; public$array= array(array()=> test string);
public function test($flag){ echo$flag test function for Foo<br/>;}
public static function output($str){ echo$str<br/>;}
public static function pare_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( w=> phppan=>=>);//序列化数组
echo数组<br/>; Foo::pare_serialize_and_json($test_data);
$foo= new Foo(); echo对象:<br/>; Foo::pare_serialize_and_json($foo);
输出
复制代码代码如下:数组序列化后的值:a::{s::"w";i:;s::"phppan";i:;s::"";i:;}; length= JSON后的值:{"w":"phppan":"":}; length=对象:序列化后的值:O::"Foo"::{s::"int";i:;s::"bool";b:;s::"array";a::{i:; a::{i:;i:;}i:;s::"test";i:;s::"string";}}; length= JSON后的值:{"int":"bool":true"array":{"":[ ]"":"test""":"string"}}; length= 很明显的长度区别 serialize在编码后大概是json的两倍
原因
&8226;serialize后字符串包含了子串的长度这可能是速度方面的优化典型的空间换时间但是它本身还是太重了&8226;serialize有更加详细的类型区分而json只有四种类型并且是以简单的符号表示
【速度的比较】
以代码说明问题如下比较速度的代码
复制代码代码如下:$max_index=; ini_set("memory_limit"" M");$array= array_fill( rand()); echo serialize<br/>;$start= xdebug_time_index(); for($i=;$i<$max_index;$i++){$str= serialize($array);}$end= xdebug_time_index(); echo$end$start<br/>;
echo json<br/>;$start= xdebug_time_index(); for($i=;$i<$max_index;$i++){$str= json_encode($array);}$end= xdebug_time_index(); echo$end$start<br/>; unset($array$str);
输出
复制代码代码如下: serialize json serialize的速度在大数据量的情况下比json差了快一个数量级
从上面两点看 json不管是在速度还是在生成的字符串的大小上都比serialize要好那为什么serialize还要存在呢?原因在下面这个点实现的功能
【处理对象】
如下代码
复制代码代码如下: header("Content type:text/;charset=utf"); class Foo{ public function test($flag){ echo$flag test function for Foo<br/>;}} $foo= new Foo();
echo反序列化测试<br/>;$foo>test();$serialize_str= serialize($foo);$obj= unserialize($serialize_str);$obj>test();
$foo>test();$json_str= json_encode($foo);$obj= json_decode($json_str);$obj>test(); die();
输出
复制代码代码如下:反序列化测试 test function for Foo test function for Foo test function for Foo (!) Fatal error: Call to undefined method stdClass::test()
json无法处理对象方法等数据
【使用范围】
lishixinzhi/Article/program/PHP/201311/20931
到底什么是PHP序列化
在PHP中,序列化用于存储或传递 PHP的值的过程中,同时不丢失其类型和结构。本文讲述PHP序列化的四种方案,感兴趣的可以了解一下
序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
1、什么是PHP序列化——serialize和unserialize函数
这两个是序列化和反序列化PHP中数据的常用函数。
$a= array(&39;a&39;=>&39;Apple&39;,&39;b&39;=>&39;banana&39;,&39;c&39;=>&39;Coconut&39;);
//序列化数组$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&39;&39;
;
//反序列化$o= unserialize($s);
print_r($o);
当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
$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)));}
2、什么是PHP序列化——json_encode和 json_decode
使用JSON格式序列化和反序列化是一个不错的选择:
使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。
JSON格式是可读的。
JSON格式比serialize返回数据结果小。
JSON格式是开放的、可移植的。其他语言也可以使用它。
$a= array(&39;a&39;=>&39;Apple&39;,&39;b&39;=>&39;banana&39;,&39;c&39;=>&39;Coconut&39;);
//序列化数组$s= json_encode($a);echo$s;//输出结果:{"a":"Apple","b":"banana","c":"Coconut"}
echo&39;
;
//反序列化$o= json_decode($s);
在上面的例子中,json_encode输出长度比上个例子中serialize输出长度显然要短。[page]
3、什么是PHP序列化——var_export和 eval
var_export函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。
$a= array(&39;a&39;=>&39;Apple&39;,&39;b&39;=>&39;banana&39;,&39;c&39;=>&39;Coconut&39;);
//序列化数组$s= var_export($a, true);echo$s;//输出结果: array(&39;a&39;=>&39;Apple&39;,&39;b&39;=>&39;banana&39;,&39;c&39;=>&39;Coconut&39;,)
echo&39;
&39;;
//反序列化eval(&39;$my_var=&39;.$s.&39;;&39;);
print_r($my_var);
4、什么是PHP序列化——wddx_serialize_value和 wddx deserialize
wddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。
$a= array(&39;a&39;=>&39;Apple&39;,&39;b&39;=>&39;banana&39;,&39;c&39;=>&39;Coconut&39;);
//序列化数组$s= wddx_serialize_value($a);echo$s;
//输出结果(查看输出字符串的源码): ApplebananaCoconut
echo&39;
&39;;
//反序列化$o= wddx_deserialize($s);
print_r($o);//输出结果:Array( [a]=> Apple [b]=> banana 1=> Coconut)
可以看出,XML标签字符较多,导致这种格式的序列化还是占了很多空间。
结论
上述所有的函数在序列化数组变量时都能正常执行,但运用到对象就不同了。例如json_encode序列化对象就会失败。反序列化对象时,unserialize和eval将有不同的效果。
本篇《什么是PHP序列化?这个知识点才是你应该了解到的用》到这里就已经结束了,小编一直认为,某一个编程软件受欢迎是有一定原因的,首先吸引人的一定是其功能,环球网校的小编祝您PHP学习之路顺利,如果你还想知道更多php知识,也可以点击本站的其他文章进行学习。
文章到这里就结束啦,如果本次分享的php序列化数据和php的序列化操作生成的哪种格式问题对您有所帮助,还望关注下本站哦!

登录后方可查看联系方式