2015-07-24 3 views
2

В настоящее время я разрабатываю программное обеспечение, в котором пользователь может определить сложную иерархию объектов в качестве параметров. Также эти объекты настроек предоставляют интерфейсы как API для других разработчиков. Теперь я хочу сохранить эти настройки и перезагрузить их.Каков наилучший способ надежного хранения сложной иерархии объектов Java?

В настоящее время я рассматриваю разные способы сделать именно это, но ни одно из моих решений не является «хорошим», на мой взгляд.

Основные цели должны быть:

  1. Он должен выводить строки, потому что я предпочитаю удобочитаемое конфигурацию по быстрой один.
  2. Он должен быть надежным, даже если код меняется. Это означает, что он не должен делать магию, но должно быть очевидно, что изменение может сломать уже сохраненную конфигурацию. (Например, как предотвратить, чтобы мой коллега переименовал класс и сломал производство.)
  3. Хранение и загрузка должны работать с o bject, интерфейсами и генериками.
  4. Сохраните конфигурацию того, что хранится как можно ниже. Я предпочел бы соглашение по конфигурации.

Я знаю, что многие из вас сталкивались с тем же или подобным вопросом при разработке.

Каково было ваше решение? Какую структуру вы использовали и почему?

Все решения, которые я придумал, либо не зависимы, ни огромные конфигурации, ни код.

Так что я с нетерпением жду возможности получить новые хорошие перспективы по этой теме от всех вас.

Спасибо.

+0

'Ни одно из моих решений не является« хорошим », на мой взгляд, например, например? –

+0

Например. Использование Gson, Сериализация, Написание собственного персистентства Интерфейс, который вручную был реализован, используя аннотации для маркировки и анализа классов ... – StaticBR

ответ

0

Для получения дополнительной информации это, как я решить эту проблему сейчас:

Я использовал Gson для сериализации иерархии объекта в формате JSON. Добавлен универсальный TypeAdapter для сериализации и десериализации всех известных интерфейсов. Этот адаптер сохраняет имя класса в объект JSON и создает этот класс при десериализации. Никакой дополнительной конфигурации не требуется, помимо регистрации этого TypeAdapter для каждого используемого интерфейса.

Чтобы сделать его надежным, я добавлю модульный тест в проект, который будет десериализовать полную возможную конфигурацию. Таким образом, любые изменения кода нарушают тесты.

Таким образом, я могу выполнить все упомянутые выше пункты.

Я надеюсь, что это поможет кому угодно.

1

Я рекомендую указать XSD и использовать JAXB для генерации классов Java, а также маршалов и немаршальных файлов настроек на основе XML.

Убедитесь, что корневой тег содержит версию XSD. Вы можете использовать StAX, чтобы сначала прочитать версию и определить правильную версию классов JAXB, если вам нужно поддерживать несколько версий.

1

Я бы порекомендовал XStream. Без какой-либо конфигурации он имеет аналогичные возможности, такие как java.io.*ObjectStream, но выводит XML вместо двоичного blob. Вы хотите добавить несколько псевдонимов для имен классов, чтобы сделать файл более читаемым.

Смежные вопросы