Библиотека с открытым исходным кодом для сохранения дерева объектов Java в БД или файл - PullRequest
0 голосов
/ 24 ноября 2011

Я ищу библиотеку с открытым исходным кодом, которую можно использовать для прозрачного сохранения Java-объектов (и их зависимостей!) В файл или в виде базы данных, своего рода снимок.

Пример использования: у меня есть состояниеигра в куче объектов, игрока, счета, местоположения и т. д. Пользователь нажимает «сохранить», и теперь мне нужно сохранить эти объекты (все объекты, которые нужно сохранить, можно аннотировать) в файл или в базу данных.Если система выйдет из строя или войдет в систему позже, я смогу восстановить с этого момента.

Я ищу библиотеку, которая может сделать это максимально прозрачно и эффективно.Транзакция и т. Д. Не требуется.Мои приоритеты будут

  1. OpenSource, бесплатно, Хорошая документация
  2. Простота использования.Пользователю не нужно вручную сохранять объект после изменения.Если ему (ей) нужно, это должно быть тривиальным действием
  3. Стабильно
  4. Должно быть легко читаемым из снимка и восстанавливаться.

Существует ли библиотекаэто охватывает все 4 или, по крайней мере, хорошую часть вышеупомянутых требований?Я склонен к аспектно-ориентированным подходам

Я спрашиваю неправильный q для моего варианта использования?В промышленности это делается совсем по-другому?

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

Вы должны быть в состоянии использовать встроенную сериализацию Java, чтобы решить эту проблему. Если вы хотите, чтобы он сохранялся автоматически, оберните вашу модель в слой, который сохранит ее для вас. Это даже можно сделать «автоматически» с использованием прокси (java.lang.reflect.Proxy).

Однако я обычно не рекомендую автоматически сохранять состояние, поскольку значения часто связаны между собой. Представьте себе класс прогресса, который отслеживает, на каком уровне вы находитесь, и как далеко вы достигли этого уровня (скажем, 0%, 25%, 50% и 75%).

Теперь вы только что завершили уровень 2, поэтому прогресс должен быть обновлен до "Уровень 3, 0%". Если вы сначала установите уровень, прогресс будет (в течение короткого периода) иметь состояние «Уровень 3, 75%», что неверно, и если вы установите, как далеко сначала вы получите «Уровень 2, 0%». Если программа остановится в любой из этих точек, у пользователя будет неправильное состояние.

1 голос
/ 24 ноября 2011

Вы можете использовать стандартный механизм сериализации Java.Если все ваши классы, которые вы хотите сохранить, реализуют интерфейс тега Serializable, вы можете прозрачно сохранить настолько большой, насколько вам нужно, граф объектов.Это не БД, это файл, но вы всегда можете прочитать эти объекты обратно в ваше приложение, и, вероятно, это лучший (или первый) вариант для вас.

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

Другая возможность заключается в сериализации объектов в формате XML или JSON.Для XML попробуйте JAXB или XStream.Для JSON посмотрите здесь .

0 голосов
/ 24 ноября 2011

Существует встроенная функциональность, которая называется ObjectInput / ObjectOutput-Stream.

http://docs.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html

Если вы хотите иметь удобочитаемый файл, вы можете использовать XStream.

http://x -stream.github.io / faq.html

...