序列化PHP字符串的结构

urb*_*ter 33 php string serialization

我想知道是否有人可以指向一个资源,其中记录了序列化的PHP字符串的详细信息.我基本上想知道格式/结构,所以我可以在VB.NET中编写一个函数来序列化/反序列化它.

谢谢!

Dec*_*ler 63

基本结构如下:

标量类型:

  1. 布尔值序列化为:

    b:<i>;
    
    Run Code Online (Sandbox Code Playgroud)

    where <i>是一个值为0(false)或1(true)的整数.

  2. 整数序列化为:

    i:<i>;
    
    Run Code Online (Sandbox Code Playgroud)

    其中<i>是整数值.

  3. 浮点数被序列化为(d含义为double):

    d:<f>;
    
    Run Code Online (Sandbox Code Playgroud)

    <f>浮点值在哪里.

  4. 字符串被序列化为:

    s:<i>:"<s>";
    
    Run Code Online (Sandbox Code Playgroud)

    where <i>是一个表示字符串长度的整数<s>,<s>是字符串值.

特殊类型:

  1. null 简单地序列化为:

    N;
    
    Run Code Online (Sandbox Code Playgroud)

复合类型:

  1. 数组序列化为:

    a:<i>:{<elements>}
    
    Run Code Online (Sandbox Code Playgroud)

    where <i>是一个整数,表示数组中元素的数量,以及<elements>零个或多个序列化键值对:

    <key><value>
    
    Run Code Online (Sandbox Code Playgroud)

    where <key>表示序列化标量类型,以及<value>可序列化的任何值.

  2. 对象序列化为:

    O:<i>:"<s>":<i>:{<properties>}
    
    Run Code Online (Sandbox Code Playgroud)

    其中第一个<i>是表示字符串长度的整数<s>,并且<s>是完全限定的类名(前面带有完整命名空间的类名).第二个<i>是表示对象属性数的整数.<properties>是零个或多个序列化的名称值对:

    <name><value>
    
    Run Code Online (Sandbox Code Playgroud)

    where <name>是表示属性名称的序列化字符串,以及<value>可序列化的任何值.

    虽然有一个问题<name>:

    <name> 表示为

    s:<i>:"<s>";
    
    Run Code Online (Sandbox Code Playgroud)

    where <i>是一个表示字符串长度的整数<s>.但<s>每个属性可见性的值不同:

    一个.随着公共属性<s>是属性的简单名称.

    湾 但是,对于受保护的属性,<s>该属性的简单名称前缀为\0*\0- 星号,用两个NUL字符(即chr(0))括起来.

    C.对于私有属性,<s>是属性的简单名称,前缀为\0<s>\0- <s>,用两个NUL字符括起来,其中<s>是完全限定的类名.


还有一些其他的例子,比如R:<i>;代表引用,我在这里没有提到(因为我老实说还没有弄清楚它的确切工作方式),但这应该会让你对PHP的序列化机制有一个体面的想法.


sup*_*jos 10

在phpinternalsbook上发现这个页面非常完整.它还显示了实现Serializable接口的类的替代序列化格式,以及R格式说明符的含义.