Какой лучший способ сохранить данные в приложении Java Desktop?

У меня есть большое дерево объектов Java в моем настольном приложении, и я пытаюсь решить, как наилучшим образом сохранить их как файл в файловой системе.

Некоторые мысли, которые у меня были, были:

  • Сбросьте свой собственный сериализатор с помощью DataOutputStream. Это даст мне лучший контроль над тем, что было в файле, но ценой микроменеджмента.

  • Прямая старая сериализация с использованием ObjectOutputStream и ее различных связанных классов. Я не продаюсь на этом, так как я нахожу данные хрупкими. Изменение любой структуры объекта ломает сериализованные экземпляры. Поэтому я заперт в том, что кажется ужасным кошмаром в версии.

  • Сериализация XML: она не такая хрупкая, но значительно медленнее, чем прямолинейная сериализация. Он может быть трансформирован вне моей программы.

  • JavaDB. Я подумал об этом, так как мне удобнее писать приложения JDBC. Разница здесь в том, что экземпляр базы данных будет сохраняться только при открытии или сохранении файла. Это не очень, но... он приспосабливается к переходу на центральную архитектуру сервера, если это возникнет позже, и это дает возможность запросить datamodel более простым способом.

Мне любопытно посмотреть, что думают другие люди. И я надеюсь, что пропустил какой-то очевидный и более простой подход, чем те, что были выше.


Вот еще несколько вариантов, выбранных из ответов ниже:

  • База данных объектов. Обладает значительно меньшей инфраструктурой, чем ORM, и работает быстрее, чем XML-подход. спасибо aku

Ответ 1

db4objects может быть лучшим выбором

Ответ 2

Я бы воспользовался вашим окончательным вариантом JavaDB (распределение Sun Derby) и использовать реляционный слой объекта, например Hibernate или iBatis. Использование первых трех aproaches означает, что вы потратите больше времени на создание ядра базы данных, чем на разработку функций приложения.

Ответ 3

Посмотрите на Hibernate как более простой способ взаимодействия с базой данных.

Ответ 4

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

Я не использовал JavaDB, но мне повезло с H2 и SQLite. SQLite - это библиотека C, которая означает немного большую работу с точки зрения развертывания. Тем не менее, он имеет преимущество хранения всей базы данных в одной межплатформенной библиотеке. В принципе, это предварительно упакованный, общий формат файла. SQLite был настолько полезен, что я даже начал использовать его вместо текстовых файлов в скриптах.

Будьте осторожны с использованием Hibernate, если вы работаете с небольшой проблемой настойчивости. Это добавляет много сложности и накладных расходов на библиотеку. Спящий режим действительно хорош, если вы работаете с большим количеством таблиц, но это, вероятно, будет громоздким, если вам нужно всего несколько таблиц.

Ответ 5

XStream from codehaus.org

Сериализация/десериализация XML в значительной степени без кодирования. Вы можете использовать аннотации, чтобы настроить его. Хорошо работать в двух проектах, в которых я работаю.

См. презентацию группы пользователей в http://cjugaustralia.org/?p=61

Ответ 6

Я думаю, это зависит от того, что вам нужно. Посмотрите варианты:

1) Искримировано! Я даже не оправдываю.:)

2) Если вам нужна простая, быстрая однонаправленная настойчивость, придерживайтесь ее. Он будет сохранять полный график данных, как есть! Остерегайтесь того, как долго вы будете поддерживать сохраненные объекты. Как указывалось вами, управление версиями может быть проблемой.

3) Медленнее, чем (2), нужен дополнительный код и может быть отредактирован пользователем. Я бы использовал его только для того, чтобы данные использовались клиентом на другом языке.

4) Если вам все равно нужно запрашивать данные, придерживайтесь решения БД.

Ну, я думаю, вы уже ответили на свой вопрос:)