PHP的serialize将变量序列化并返回具有变量类型和结构的字符串表达式,而JSON是一种更轻量且更友好的socket(AJAX、REST等)数据交换格式。 它们都表示字符串形式的数据结构。
1。目的
Serialize主要用于php的序列化php 数组序列化,存储在文件或数据库中
json_encode序列化主要用于与其他语言交互。 对于传输来说,json有很多优点。
2内容
通过serialize序列化后的字符串包含额外的内容,即值的类型和粗细的编码
json_encode 仅包含键值
Serialize后的内容应小于json_encode后内容的宽度
3对象序列化
解码json_decode时,请注意,如果是序列化的数值字段,json_decode可以恢复到原来的字段php 数组序列化,但如果序列化的是关联链表(或对象),则json_decode很难判断是否是关联的字段或对象。 ,所以 json_decode 会恢复默认解析为 stdclass 的对象。 如果添加第二个参数true,则会解析为关联字段
4 对象模式
json_encode无法序列化对象的成员方法
Serialize序列化后,unserialize反序列化数据,可以再次调用成员方法,而json_decode不起作用,会报错
5__sleep 和 __wakeUp 魔术
当对象被序列化时,PHP 将调用 __sleep 方法(如果存在,但执行操作,例如对变量参数进行操作)。 反序列化对象后,PHP 将调用 __wakeup 方法。 这两个方法都不接受参数。 __sleep方法必须返回一个链表,其中包括需要序列化的属性。 PHP 会丢弃其他属性的值。 如果没有__sleep方法,PHP将保存所有属性。
在程序执行之前,serialize()函数会首先检测是否有魔术__sleep。 如果存在,会先调用__sleep()方法,然后进行序列化(serialization)操作。 该函数可用于清除对象并返回一个包含对象中所有变量名称的字段(必须返回。相反,unserialize() 会检测是否存在 __wakeup 技巧。如果存在,则 __wakeup 方法将首先被调用,比如可以用来重新加入数据库。
6.演示
类Foo{
私人$名称;
公共函数测试(){
返回“测试”;
$foo=newFoo();
$cser=序列化($foo);
$uncser=反序列化($cser);
$json=json_encode($foo);
$unjson=json_decode($json);
回声 $uncser->test();
回声 $unjson->test();
输出:
测试
PHPFatalerror:Calltound 在 /tmp/php/serialize.phponline33 中定义了方法 stdClass::test()