Проблема в том, что классы, реализующие Serializable
, и классы, не реализующие интерфейс , используют другой формат сериализации .
Классы, которые не реализуют интерфейс, будут использовать "O нотацию":
O:1:"A":1:{s:5:"hello";s:5:"world";}
В то время как классы, реализующие Serializable
, будут использовать «С нотацию».Ваш B
класс serializaed будет выглядеть следующим образом:
C:1:"B":12:{s:5:"world";}
Десериализация просто не сработает, потому что вы пытаетесь отменить сериализацию до «неправильного» определения.
Это изменение произошлов 5.6 сообщалось как ошибка, и ответ был wontfix из-за последствий для безопасности старого поведения.
То, что вы пытаетесь сделать , работало только с PHP 5.3 до5.5 , насколько я могу судить.В документации упоминалось, что для классов, реализующих Serializable
, метод __wakeup()
был вызван перед вызовом unserialize()
, но это было частью того, что было удалено в 5.6.
Вам понадобится обходной путь для десериализацииэти данные, и в долгосрочной перспективе я бы перенес сериализованные данные в более безопасный, более переносимый формат, такой как JSON.