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