Мне было интересно, может ли кто-нибудь указать мне ресурс, где документируются детали сериализованной строки 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