Мне было интересно, может ли кто-нибудь указать мне ресурс, где документируются детали сериализованной строки php. Мне бы хотелось узнать формат / структуру, чтобы я мог написать функцию в VB.NET для сериализации / десериализации.
Благодаря!
Базовая структура выглядит следующим образом:
Скалярные типы:
Булевы сериализуются как:
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.
Я нашел эту страницу в phpinternalsbook совершенно полной. Он также показывает альтернативный формат сериализации для классов, реализующих интерфейс Serializable
, а также значение спецификатора формата R