php序列化输出中的数字是多少


what are those numbers in php serialize output

class Aclas {
    private $v = 1;
    private $z;
    protected $y;
    public $xy;
}
$obja = new Aclas;
echo serialize( $obja );

我得到的输出如下

O:5:"Aclas":4:{s:8:"Aclasv";i:1;s:8:"Aclasz";N;s:4:"*y";N;s:2:"xy";N;}

但有人请在打开大括号后立即告诉我什么是s:8

{s:8:"Aclasv",是字符串,长度为8。

我正在寻找一秒钟的文件。

更新:似乎找不到任何文档。也许我会查找相应的链接。PHP源代码。。。我现在也很好奇。可能只是更容易进行逆向工程并理解它。

最佳链接这很酷,代码有完整的解析器:https://github.com/ktomk/Serialized

Serialized是一组类,可以将序列化的数据解析为规范化的表示(半结构化数据或S-表达式(。

首先,这个问题没有任何特殊意义,因为:

  • serialize生成一个值的可存储表示,该值只能由unserialize使用
  • 它的输出没有"标准化"。它不是JSON。不能保证在一个版本的PHP中序列化某些内容,并尝试在不同版本中取消序列化((
  • 试图理解和解码它生成的字符是毫无意义的

但如果你还想知道:

s: 8表示8字节的字符串。它与"Aclasv"的长度不匹配,因为它很可能包含一些不可打印/特殊的字符(准确地说,在其他注释中为null(。请检查这个代码:

class A {
    private $v = 1;
}
$obja = new A;
var_dump($obja);
// object(A)#1 (1) { ["v:private"]=> int(1) }
$x = serialize( $obja );
var_dump($x);
// note that this string is 27 chars long but only 25 are printed!
// string(27) "O:1:"A":1:{s:4:"Av";i:1;}"
var_dump(unserialize($x));
// object(A)#2 (1) { ["v:private"]=> int(1) }
// proof it is not the same:
var_dump(unserialize('O:1:"A":1:{s:4:"Av";i:1;}'));
// bool(false)