Сохранение графов объектов Java в виде файла XML
Какова самая простая в использовании технология, доступная для сохранения произвольного графа Java-объектов в виде XML-файла (и для возможности повторной гидратации объектов позже)?
15 ответов
Самый простой способ - сериализовать граф объектов. Java 1.4 имеет встроенную поддержку сериализации в виде XML.
Решение, которое я успешно использовал, - это XStream ( http://x-stream.github.io/)- - это небольшая библиотека, которая легко позволит вам сериализовать и десериализовать в и из XML.
Недостатком является то, что вы можете только очень ограниченно определить результирующий XML; что не может быть необходимым в вашем случае.
Apache digester довольно прост: http://commons.apache.org/digester/
JAXB новее и поставляется с аннотацией совершенства: https://jaxb.dev.java.net/
XStream от людей из Thoughtworks имеет простой API и даже работает с такими вещами, как дубликаты и циклические ссылки. Похоже, что он активно развивается и хорошо документирован.
просто
Хотя XStream и JAXB могут сериализовать некоторые графы объектов успешно, они не могут обрабатывать очень сложные графы. Наиболее мощное решение для больших сложных графов - это простая XML-сериализация. Он может обрабатывать любой график. Кроме того, это быстро и просто в использовании без каких-либо зависимостей.
Чтобы процитировать простую страницу проекта:
Simple - это высокопроизводительная платформа XML-сериализации и конфигурации для Java. Его цель - предоставить структуру XML, которая обеспечивает быструю разработку систем конфигурации и связи XML. Эта структура помогает разработке систем XML с минимальными усилиями и уменьшением количества ошибок. Он предлагает полную сериализацию и десериализацию объектов, поддерживая каждую встреченную ссылку. По сути, это похоже на сериализацию C# XML для платформы Java, но предлагает дополнительные функции для перехвата и манипуляции.
Использование java.beans.XMLEncoder
, Его API очень прост (на самом деле он слишком прост; было бы неплохо подключить его к SAX ContentHandler), но он работает на многих графах из коробки, и легко создать свой собственный делегат персистенции для любого нечетного классы мяча, с которыми вы можете столкнуться.
- Синтаксис, используемый XMLDecoder, позволяет вам вызывать любой метод, экземпляр или статический объект, включая конструкторы, поэтому он чрезвычайно гибок.
- Другие кодировщики присваивают имена и атрибуты именам классов и полей, поэтому для результата нет фиксированной схемы. XML-код XMLEncoder следует простому DTD и может быть легко проверен или преобразован, даже если вы никогда не видели используемые им типы.
- Вы можете назначить объектам идентификатор и ссылаться на них по всему графику.
- Вы можете ссылаться на константы, определенные в классах или интерфейсах.
И он встроен в Java SE, поэтому вам не нужно поставлять дополнительную библиотеку.
Если вам нужен контроль над генерируемым XML, я рекомендую взглянуть на Betwixt ( http://commons.apache.org/betwixt/) - он добавляет множество функциональных возможностей в дайджест Apache (Digester хорош для построения графов объектов из XML, но не очень хорошо для их генерации).
Если вы действительно не заботитесь о генерируемом XML (просто о том, что он может быть десериализован в будущем), то классы XMLEncoder/Decoder встроены в Java или хорошо - если объекты, которые вы сериализуете, следуют спецификации JavaBean. Самая большая область, в которой я столкнулся с проблемами с решением XMLEncoder/Decoder - это если у вас есть компонент, возвращающий неизменный список для одного из его свойств - кодировщик не очень хорошо справляется с этой ситуацией.
JAX-B является частью стандартных API и действительно прост в использовании.
Простой API, ну просто! Это действительно хорошо. http://simple.sourceforge.net/
Вы также можете использовать XStream: http://www.ibm.com/developerworks/library/x-xstream/index.html
XStream очень прост http://x-stream.github.io/
XStream - это простая библиотека для сериализации объектов в XML и обратно.
Я собрал список с большим количеством библиотек сериализации XML и его лицензию
Если вам нужно контролировать структуру XML, XStream - хороший выбор. Вы можете использовать аннотации, чтобы точно определить структуру / отображение XML и ваших объектов.
Я бы второй (или третий) XStream. Он читает и записывает XML без необходимости специальной настройки привязки или размещения большого количества постороннего синтаксиса в XML.
Джексон
Проект Джексона - это библиотека обработки и связывания для XML, JSON и некоторых других форматов.
… Jackson - это набор инструментов для обработки данных для Java (и платформы JVM), включая флагманскую потоковую библиотеку JSON-анализатор / генератор, библиотеку сопоставления данных (POJO в и из JSON) и дополнительные модули формата данных для обработки закодированных данных. в свойствах Avro, BSON, CBOR, CSV, Smile, (Java), Protobuf, XML или YAML; и даже большой набор модулей формата данных для поддержки типов данных широко используемых типов данных, таких как Guava, Joda, PCollections и многие, многие другие...
Если вас действительно интересует только сериализация ваших объектов в файл, а затем десериализация их позже, вы можете проверить YAML вместо XML. С YAML работать намного проще, чем с XML, и выходные файлы очень удобочитаемы (что может быть или не быть требованием). Проверьте http://yaml.org/ для получения дополнительной информации. Я успешно использовал JYAML в недавнем проекте.