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