Подтвердить что ты не робот

Структура строки Serialized PHP

Мне было интересно, может ли кто-нибудь указать мне ресурс, где документируются детали сериализованной строки php. Мне бы хотелось узнать формат/структуру, чтобы я мог написать функцию в VB.NET для сериализации/десериализации.

Спасибо!

4b9b3361

Ответ 1

Основная структура выглядит следующим образом:

Скалярные типы:

  • Булевы сериализуются как:

    b:<i>;
    

    где <i> - целое число со значением либо 0 (false), либо 1 (true).

  • Целые числа сериализуются как:

    i:<i>;
    

    где <i> - целочисленное значение.

  • Поплавки сериализуются как (с d означает double):

    d:<f>;
    

    где <f> - значение поплавка.

  • Строки сериализуются как:

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

    где <i> - целое число, представляющее длину строки <s>, а <s> - строковое значение.

Специальные типы:

  • null просто сериализуется как:

    N;
    

Составные типы:

  • Массивы сериализуются как:

    a:<i>:{<elements>}
    

    где <i> - целое число, представляющее число элементов в массиве, и <elements> нулевые или более сериализованные пары ключей:

    <key><value>
    

    где <key> представляет собой сериализованный скалярный тип и <value> любое значение, которое может быть сериализуемым.

  • Объекты сериализуются как:

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

    где первый <i> представляет собой целое число, представляющее длину строки <s>, а <s> - это полное имя класса (имя класса, добавленное с полным пространством имен). Второй <i> представляет собой целое число, представляющее количество свойств объекта. <properties> - это пары с нулевыми или более сериализованными именами:

    <name><value>
    

    где <name> представляет собой сериализованную строку, представляющую имя свойства, и <value> любое сериализуемое значение.

    Есть уловка с <name>, хотя:

    <name> представляется как

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

    где <i> - целое число, представляющее длину строки <s>. Но значения <s> различаются по видимости свойств:

    а. С общедоступными свойствами <s> является простым именем свойства.

    б. Однако с защищенными свойствами <s> является простым именем свойства, добавленным \0*\0 - звездочкой, заключенной в два символа NUL (т.е. chr(0)).

    с. И с частными свойствами, <s> - это простое имя свойства, добавленное с помощью \0<s>\0 - <s>, заключенное в два символа NUL, где <s> - это полностью квалифицированный класс имя.


Есть несколько других случаев, таких как R:<i>;, которые представляют ссылки, которые я не упоминал здесь (потому что я честно еще не понял его работы), но это должно дать вам Порядочная идея о механизме сериализации PHP.

Ответ 2

Я нашел эту страницу в phpinternalsbook довольно полно. Он также показывает альтернативный формат сериализации для классов, реализующих интерфейс Serializable, а также значение спецификатора формата R.