- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PHP_序列化(serialize)格式详解.pdf
PHP序列化 serialize 格式详解
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 中扩展的对象序列化格式的支持。
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 型数据被序列化为:
b:;
其中 为 0 或 1,当 boolean 型数据为
文档评论(0)