Я хотел сериализовать полный граф объекта PHP -в строковое представление JSON и десериализовать его обратно в идентичный граф объекта PHP -.
Вот краткое изложение вариантов, которые я рассмотрел, и причины, по которым они не работают для меня.:
serialize()
не делает то, что я хочу, потому что использует формат, специфичный для PHP. Мне нужен формат, широко поддерживаемый большинством языков, и человек -удобочитаемый/редактируемый.
json_encode()
не делает то, что я хочу, потому что он делает только простые значения и массивы, а не объекты. (На самом деле я использую это в своей реализации, см. ниже.)
var_export()
не обрабатывает циклические ссылки и не делает то, что я хочу (, см. выше.)(обратите внимание, что моя текущая реализация также не обрабатывает циклические ссылки -см. комментарии и ответы ниже для разъяснения этой проблемы.)
Sebastian Bergmann Object Freezer — хорошая реализация, но она также не делает то, что мне нужно -, она использует очень длинную форму и полагается на заполнение сериализованных объектов идентификаторами GUID.
Serialized не делает то, что я хочу -он фактически не выполняет сериализацию, он анализирует вывод serialize()
и создает другое представление, например. XML, но не может проанализировать это представление. (он также не поддерживает JSON. -XML — это очень длинная форма, и это не то, что мне нужно.)
Теперь у меня есть работающая реализация, которой я могу поделиться:
https://github.com/mindplay-dk/jsonfreeze
JSON -представление объекта -графа выглядит следующим образом:
{
"#type": "Order",
"orderNo": 123,
"lines": [{
"#type": "OrderLine",
"item": "milk \"fuzz\"",
"amount": 3,
"options": null
}, {
"#type": "OrderLine",
"item": "cookies",
"amount": 7,
"options": {
"#type": "#hash",
"flavor": "chocolate",
"weight": "1\/2 lb"
}
}],
"paid": true
}
Этот подход предназначен для работы с чистым древовидным -структурным агрегатом -не допускаются циклические ссылки, а также множественные ссылки на одни и те же объекты. Другими словами, это не общая -цель, как, например.serialize()
и unserialize()
, которые функционируют для любого графа объектов PHP -.
В моем начальном подходе я использовал сериализованную форму, которая по существу представляла собой базовый -0 список объектов. Первый объект в списке (номер 0 )является корнем графа сериализованных объектов -, все остальные объекты хранятся в порядке их обнаружения.
В текущей реализации представление JSON напоминает исходную структуру дерева -настолько, насколько это возможно, что позволяет фактически работать с представлением JSON графа объекта -в JavaScript. Единственным отклонением является волшебное #type
свойство (с префиксом #для предотвращения конфликта с именами свойств -)и «типом» #hash
, используемым для различения хэшей типаarray
-(. хранятся как объекты JSON )из массивов обычного типаarray
-(хранятся как массивы JSON ).
Я оставляю здесь эти заметки о предыдущей версии для исторических целей.
Циклические ссылки обрабатываются просто за счет того, что никогда не сохраняются вложенные объекты внутри сериализованного представления каждого объекта -. Вместо этого любая ссылка на объект -сохраняется как объект JSON -с индексом объекта --. например {"__oref":2}
— ссылка на объект с индексом 2
в списке объектов -.
У меня возникла проблема со ссылками на массив -в моей реализации -, когда я var _dump ()внутри кода, восстанавливающего ссылки на объекты в массив, они заполняются, но в в какой-то момент массив копируется, и вы получаете пустую копию. Я пробовал размещать символы &
повсюду в коде, но независимо от того, где я передаю по ссылке, конечный результат -— это пустой массив.