序列化 PHP 字符串的结构

2022-08-30 12:52:03

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

谢谢!


答案 1

基本结构如下:

标量类型:

  1. 布尔值序列化为:

    b:<i>;
    

    其中 是值为 (假) 或 (真) 的整数。<i>01

  2. 整数序列化为:

    i:<i>;
    

    其中 是整数值。<i>

  3. 浮点数序列化为(含义为双精度):d

    d:<f>;
    

    其中 是浮点值。<f>

  4. 字符串序列化为:

    s:<i>:"<s>";
    

    其中 是一个整数,表示 的字符串长度,并且是字符串值。<i><s><s>

特殊类型:

  1. null简单地序列化为:

    N;
    

化合物类型:

  1. 数组序列化为:

    a:<i>:{<elements>}
    

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

    <key><value>
    

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

  2. 对象序列化为:

    O:<i>:"<s>":<i>:{<properties>}
    

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

    <name><value>
    

    其中 是一个序列化字符串,表示属性名称以及任何可序列化的值。<name><value>

    不过,<name>但有一个问题:

    <name>表示为

    s:<i>:"<s>";
    

    其中 是一个整数,表示 的字符串长度。但是,根据属性的可见性,的值会有所不同:<i><s><s>

    一个。公共属性是属性的简单名称。<s>

    b.但是,使用受保护的属性的是属性的简单名称,前面附加了 - 一个星号,用两个字符括起来(即 )。<s>\0*\0NULchr(0)

    c. 对于私有属性,是属性的简单名称,前面附加 — ,括在两个字符中,其中是完全限定的类名。<s>\0<s>\0<s>NUL<s>


还有其他一些情况,例如,代表引用,我在这里没有提到(因为老实说我还没有弄清楚它的确切工作原理),但这应该让你对PHP的序列化机制有一个不错的了解。R:<i>;


答案 2

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


推荐