Сериализация/десериализация графа объекта PHP -в JSON

Я хотел сериализовать полный граф объекта 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 ()внутри кода, восстанавливающего ссылки на объекты в массив, они заполняются, но в в какой-то момент массив копируется, и вы получаете пустую копию. Я пробовал размещать символы &повсюду в коде, но независимо от того, где я передаю по ссылке, конечный результат -— это пустой массив.

6
задан emlai 15 July 2015 в 01:10
поделиться