PHP 序列化(serialize)格式详解

滦县狂少k

滦县狂少k

2016-01-29 13:36

PHP 序列化(serialize)格式详解,PHP 序列化(serialize)格式详解

本文转自:http://www.coolcode.cn/?p=170

1.前言

PHP (从 PHP 3.05 开始)为保存对象提供了一组序列化和反序列化的函数:serialize、unserialize。不过在 PHP 手册中对这两个函数的说明仅限于如何使用,而对序列化结果的格式却没做任何说明。因此,这对在其他语言中实现 PHP 方式的序列化来说,就比较麻烦了。虽然以前也搜集了一些其他语言实现的 PHP 序列化的程序,不过这些实现都不完全,当序列化或反序列化一些比较复杂的对象时,就会出错了。于是我决定写一份关于 PHP 序列化格式详解的文档(也就是这一篇文档),以便在编写其他语言实现的 php 序列化程序时能有一个比较完整的参考。这篇文章中所写的内容是我通过编写程序测试和阅读 PHP 源代码得到的,所以,我不能 100% 保证所有的内容都是正确的,不过我会尽量保证我所写下的内容的正确性,对于我还不太清楚的地方,我会在文中明确指出,也希望大家能够给予补充和完善。

2.概述

PHP 序列化后的内容是简单的文本格式,但是对字母大小写和空白(空格、回车、换行等)敏感,而且字符串是按照字节(或者说是 8 位的字符)计算的,因此,更合适的说法是 PHP 序列化后的内容是字节流格式。因此用其他语言实现时,如果所实现的语言中的字符串不是字节储存格式,而是 Unicode 储存格式的话,序列化后的内容不适合保存为字符串,而应保存为字节流对象或者字节数组,否则在与 PHP 进行数据交换时会产生错误。

PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的 Using Serialized PHP with Yahoo! Web Services 一文中给出所有的字母标示及其含义:

a - array b - boolean d - double i - integer o - common object r - reference s - string C - custom object O - class N - null R - pointer reference U - unicode string

N 表示的是 NULL,而 b、d、i、s 表示的是四种标量类型,目前其它语言所实现的 PHP 序列化程序基本上都实现了对这些类型的序列化和反序列化,不过有一些实现中对 s (字符串)的实现存在问题。

a、O 属于最常用的复合类型,大部分其他语言的实现都很好的实现了对 a 的序列化和反序列化,但对 O 只实现了 PHP4 中对象序列化格式,而没有提供对 PHP 5 中扩展的对象序列化格式的支持。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/php/)

r、R 分别表示对象引用和指针引用,这两个也比较有用,在序列化比较复杂的数组和对象时就会产生带有这两个标示的数据,后面我们将详细讲解这两个标示,目前这两个标示尚没有发现有其他语言的实现。

C 是 PHP5 中引入的,它表示自定义的对象序列化方式,尽管这对于其它语言来说是没有必要实现的,因为很少会用到它,但是后面还是会对它进行详细讲解的。

U 是 PHP6 中才引入的,它表示 Unicode 编码的字符串。因为 PHP6 中提供了 Unicode 方式保存字符串的能力,因此它提供了这种序列化字符串的格式,不过这个类型 PHP5、PHP4 都不支持,而这两个版本目前是主流,因此在其它语言实现该类型时,不推荐用它来进行序列化,不过可以实现它的反序列化过程。在后面我也会对它的格式进行说明。

最后还有一个 o,这也是我唯一还没弄清楚的一个数据类型标示。这个标示在 PHP3 中被引入用来序列化对象,但是到了 PHP4 以后就被 O 取代了。在 PHP3 的源代码中可以看到对 o 的序列化和反序列化与数组 a 基本上是一样的。但是在 PHP4、PHP5 和 PHP6 的源代码中序列化部分里都找不到它的影子,但是在这几个版本的反序列化程序源代码中却都有对它的处理,不过把它处理成什么我还没弄清楚。因此对它暂时不再作更多说明了。

3.NULL 和标量类型的序列化

NULL 和标量类型的序列化是最简单的,也是构成符合类型序列化的基础。这部分内容相信许多 PHP 开发者都已经熟知。如果您感觉已经掌握了这部分内容,可以直接跳过这一章。

3.1.NULL 的序列化

在 PHP 中,NULL 被序列化为:

N;3.2.boolean 型数据的序列化

boolean 型数据被序列化为:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/php/)b:<digit;

其中 <digit 为 0 或 1,当 boolean 型数据为 false 时,<digit 为 0,否则为 1。

3.3.integer 型数据的序列化

integer 型数据(整数)被序列化为:

展开更多 50%)
分享

猜你喜欢

PHP 序列化(serialize)格式详解

PHP
PHP 序列化(serialize)格式详解

PHP拥有序列化方法

Web开发
PHP拥有序列化方法

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

序列化FastReport

编程语言 网络编程
序列化FastReport

PHP中的串行化变量和序列化对象

PHP
PHP中的串行化变量和序列化对象

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

J2SE中的序列化之接受默认序列化

编程语言 网络编程
J2SE中的序列化之接受默认序列化

深入理解Java对象的序列化与反序列化的应用

编程语言 网络编程
深入理解Java对象的序列化与反序列化的应用

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《噬神者》R4难度 打荒神的心理战术

《噬神者》R4难度 打荒神的心理战术

PHP 开发程序加速运行探索之慢代码优化方法

PHP 开发程序加速运行探索之慢代码优化方法
下拉加载更多内容 ↓