Частичная сериализация и десериализация bean-компонентов + слияние - PullRequest
3 голосов
/ 09 апреля 2009

Я занимаюсь разработкой веб-службы RESTful.

У меня есть куча классов сущностей (в основном сущности JPA, но также и другие bean-компоненты).

Существует множество библиотек сопоставления объектов, сериализации, связывания и еще много чего. Я ищу тот, который позволит мне:

  • Сериализация объектов в XML и JSON

    Сериализация ДОЛЖНА поддерживать использование геттеров , а не только полей объекта.

    ДОЛЖЕН поддерживать просмотров . Под представлениями я подразумеваю способ указать подмножество свойств объекта, которые должны быть сериализованы. Например, см. Получение частичных ресурсов в Yahoo! API социальной платформы. Я также не хочу, чтобы это повторялось бесконечно глубоко:

    Представление должно определять а) свойства, которые должны быть представлены в сущности, и б) представление для каждого из них (если они сами являются сущностями).

    Например, у сущности Person могут быть представления full и simple. При запросе simple представления Person только свойства id, firstName и lastName будут сериализованы. При запросе представления full свойства mother и father (которые сами по себе Persons) также будут сериализованы, но только с представлением simple (таким образом, оно не будет возвращаться бабушке и дедушке).

    Сериализация JSON ДОЛЖНА быть "естественной" , то есть иметь смысл в Javascript. Это означает, что мне нужны правильные целые числа, логические и нулевые значения, и мне не нужны дополнительные обертки объектов или что-то, что пытается захватить весь XML Infoset.

    Для XML ДОЛЖНО быть возможно настроить сериализацию для использования пустых элементов для сериализации нулей, а не атрибутов xsi:nil="true" схемы XML.

    Кроме того, массивы должны быть сериализованы с использованием вложенных элементов, чтобы можно было различать пустые массивы и свойства, которых нет в данном представлении:

    • Не определено friends свойство (отсутствует в представлении):

      <person>
      </person>
      
    • Пустой массив, у человека нет друзей:

      <person>
          <friends></friends>
      </person>
      
  • Десериализовать XML и JSON и объединить данные в существующие сущности

    Теперь это сложная часть. Следующие два связаны:

    Десериализация частичных объектов ДОЛЖНА быть возможной (аналогично представлениям, но какие свойства присутствуют, заранее не определено).

    Слияние с существующими свойствами, а не создание новых.

    Это немного сложно объяснить. Большинство библиотек десериализуются в объекты Java, но в то время различие между неопределенным свойством и нулевым / пустым свойством (как оно существует в Javascript / JSON, XML, как описано выше, PHP, ...) потеряно.

    При получении этого XML:

    <person>
        <lastName>Bon Jovi</lastName>
        <friends></friends>
    </person>
    

    и переданный объект Person, библиотека должна:

    person.setLastName("Bon Jovi");
    person.setFriends(new ArrayList());
    

    Он не должен касаться сущностей firstName и / или очищать его, например, father.

    Конечно, со списками это должно быть более сложным. Я хотел бы настроить свойство id, с помощью которого он будет решать, обновлять ли вложенную сущность или создавать новую.

    Эти обновления / исправления являются причиной, по которой библиотека НЕ ​​ДОЛЖНА просто возвращать DTO: потому что в это время null может означать либо «unset», либо «ничего не делать».

Ну вот и все. Я уже много говорил «ДОЛЖЕН», теперь я понимаю, что библиотека на самом деле не должна этого обеспечивать, но должен быть способ добавить функциональность в чистом виде (= не таким образом, чтобы все переписывалось) проще).

Ответы [ 2 ]

1 голос
/ 13 января 2011

Для чего это стоит, Джексон имеет частичное обновление из коробки:

ObjectMapper mapper = new ObjectMapper();
Bean existing = ...;
mapper.updatingReader(existing).readValue(jsonSource);

и он также может конвертировать совместимые типы (аналогично сериализации в JSON, обратному чтению в другой тип).

Для XML-части вы можете использовать JAXB, хотя, насколько я знаю, он может выполнить только связывание.

1 голос
/ 09 апреля 2009

Я не знаю существующих библиотек, которые делают все, что вам нужно, но, предполагая, что вам нужно что-то реализовать:

  • Написание XML или JSON на основе свойств бина довольно просто:

    • Посмотрите, как использовать Apache Commons BeanUtils, чтобы получить все значения свойств (http://commons.apache.org/beanutils/). В частности, класс PropertyUtils.
    • Используйте BeanUtils рекурсивно для обхода всего графа объектов - будьте осторожны с циклами - вам понадобится набор или что-то в стороне, чтобы отслеживать то, что вы уже видели
    • XML: посмотрите на XMLEncoder - он работает с использованием свойств JavaBean для создания XML
  • Для чтения. Одним из подходов может быть использование существующих библиотек (для JSON или XML) для создания объектов, а затем работа со слиянием свойств между объектами. Класс XMLDecoder может читать XML-компонент (при условии, что вы создаете его с использованием XMLEncoder). Сложность этого подхода заключается в том, чтобы узнать, когда значение было «установлено» равным нулю, а не задано в XML. Этот подход также требует дополнительных затрат на создание группы новых объектов.

  • В противном случае чтение JSON или XML немного сложнее, но не так уж плохо

    • Полагаю, у вас уже есть некоторые средства для индексирования объектов, в которые вы хотите объединиться (например, какая-то карта)
    • Я предполагаю, что у вас уже есть какие-то средства, чтобы узнать, какое свойство является ключом, который однозначно идентифицирует объект (я предполагаю, что фамилия просто для того, чтобы передать точку зрения, так как это сделало бы плохой ключ)
    • XML: для такого типа использования я бы порекомендовал SAX-ридер для xml - вам понадобится стек, чтобы отслеживать, к каким объектам вы добавляете данные. Считыватель SAX сообщает вам, какие теги видны, а затем выдает значения для этих тегов. Вы также можете использовать здесь XML pull, который обычно немного быстрее
    • JSON: взгляните на некоторые библиотеки JSON с открытым исходным кодом и внесите некоторые изменения. Анализ JSON довольно прост, и эти инструменты, как правило, довольно малы, так что это не должно иметь большого значения. В качестве альтернативы, вы можете написать анализатор ANTLR (или другой генератор), чтобы читать JSON и делать с ним, как вам нравится.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...