XStream или Простой - PullRequest
       49

XStream или Простой

7 голосов
/ 13 октября 2009

Мне нужно решить, какой из них использовать. Мой случай довольно прост. Мне нужно конвертировать простой POJO / Bean в XML, а затем обратно. Ничего особенного.

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

Если кто-нибудь может сравнить эти два с минусами и плюсами, и то, что отсутствует в каком. Я знаю, что XStream также поддерживает JSON, это плюс. Но Simple выглядело бы проще с первого взгляда, если мы отложим JSON. Каково будущее Simple с точки зрения развития и сообщества? Я считаю, что XStream довольно популярен, даже слово «XStream» затронуло много тем на SO.

Спасибо.

Ответы [ 9 ]

11 голосов
/ 28 апреля 2010

Просто прочитав документацию (я столкнулся с той же проблемой, что и вы, но еще не пробовал; возьмите это с крошкой соли):

XSTREAM

  1. Очень, очень легко для Google. Примеры, сообщения на форуме и сообщения в блоге об этом тривиально найти.
  2. Работает из коробки. (Конечно, может потребоваться дополнительная настройка, но это немедленно даст вам что-то .)
  3. Преобразование переменной в атрибут требует создания отдельного класса преобразователя и его регистрации в XStream. (Это не сложно для простых значений, но это немного дополнительная работа.)
  4. Не обрабатывает версии вообще, если только вы не добавите в XMT (другую библиотеку); если XML, сгенерированный вашим классом, изменится, он вообще не будет десериализован. (После того, как вы добавите XMT, вы можете изменять ваши классы так, как вам нравится, и XStream сможет с этим справляться, если вы создаете все возрастающую линию функций инкрементного контроля версий.)
  5. Все корректировки требуют от вас написания кода, либо для реализации ваших собственных функций (de) сериализации, либо для вызова функций XStream, чтобы изменить используемые методы (de) сериализации.
  6. Примечание по тривиальному синтаксису: вам нужно привести вывод десериализатора в ваш класс.

SIMPLE

  1. Домашняя страница является единственным надежным источником информации; в нем перечислены полдюжины внешних статей, и есть список рассылки, но вы не можете найти его в диком Интернете.
  2. Требуется аннотировать ваш код перед тем, как он заработает.
  3. Легко сделать более компактный XML-файл, используя атрибуты вместо узлов XML для каждого свойства.
  4. Обрабатывает управление версиями, будучи нестрогим при разборе всякий раз, когда класс верен, но версия отличается. (т. е. если вы добавили два поля и удалили одно со времени последней версии, он будет игнорировать удаленное поле и не выбрасывать исключение, но не будет устанавливать добавленные поля.) Как и в случае с XStream, он не имеет способ переноса данных из одной версии в другую, но, в отличие от XStream, нет внешней библиотеки, в которую можно было бы вмешиваться и обрабатывать ее. Предположительно, способ справиться с этим - с помощью некоторой внешней функции (и, возможно, переменной «version» в вашем классе?), Поэтому вы делаете

    Stuff myRestoredStuff = serializer.read (Stuff.class, file); myRestoredStuff.sanityCheck ();

  5. Обычно используемые (де) корректировки сериализации производятся путем добавления / редактирования аннотаций, но есть поддержка написания ваших собственных (де) сериализационных функций для переопределения стандартных методов, если вам нужно что-то сделать не так.

  6. Примечание по тривиальному синтаксису: вам нужно передать класс восстановленного объекта в десериализатор (но вам не нужно приводить результат).
8 голосов
/ 09 июля 2010

Почему бы вместо этого не использовать JAXB?

  • 100% охват схемы
  • Огромная база пользователей
  • Несколько реализаций (в случае, если вы столкнулись с ошибкой в ​​одной)
  • Включено в Java SE 6, совместимо с JDK 1.5
  • Связующий слой для JAX-WS (веб-сервисы)
  • Связующий слой для JAX-RS (Rest)
  • Совместимо с JSON (при использовании с такими библиотеками, как Jettison)

Полезные ресурсы:

7 голосов
/ 13 октября 2009

Я бы рекомендовал вам взглянуть на Simple

2 голосов
/ 14 октября 2009

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

1 голос
/ 28 декабря 2012

Один «простой» (каламбур) недостаток Simple и Jaxb заключается в том, что они требуют аннотирования ваших объектов перед тем, как их можно сериализовать в XML. Что происходит в тот день, когда вы быстро захотите сериализовать чужой код с объектами, которые не аннотированы? Если вы увидите, что это произойдет однажды, XStream подойдет лучше. (Иногда это просто сводится к таким простым требованиям, которые определяют ваши решения).

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

Пока что я никогда не использовал Simple Framework.

Основано на моем опыте работы с Xstream. Он хорошо работал на XML. Однако для JSON результат не такой точный, как ожидалось, когда я пытаюсь сериализовать бин, содержащий список Hashtable.

0 голосов
/ 12 июля 2012

Я поделился этим здесь. Чтобы XStream игнорировал отсутствующие поля (когда вы удалили свойство):

 XStream xstream = new XStream() {
  @Override
  protected MapperWrapper wrapMapper(MapperWrapper next) {
    return new MapperWrapper(next) {
      @Override
      public boolean shouldSerializeMember(Class definedIn,
              String fieldName) {
        if (definedIn == Object.class) {
          return false;
        }
        return super.shouldSerializeMember(definedIn, fieldName);
      }
    };
  }
};   

Это также может быть расширено для обработки версий и переименований свойств.

Кредит Питеру Воссу: https://pvoss.wordpress.com/2009/01/08/xstream

0 голосов
/ 17 марта 2011

Simple намного медленнее, чем XStream (в объектах сериализации в xml)

http://pronicles.blogspot.com/2011/03/xstream-vs-simple.html

0 голосов
/ 07 июля 2010

Быстро взглянул на простое при чтении stackoverflow; В качестве дополнения к полезному посту Пола Маршалла я подумал, что упомяну, что Simple, похоже, поддерживает управление версиями посредством аннотаций -

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#version

...