Каковы относительные преимущества XMLEncoder и XStream?

Предположим, я хочу хранить множество небольших объектов конфигурации в XML, и мне не слишком важен формат. Подойдет класс XMLDecoder, встроенный в JDK, и, насколько я слышал, XStream работает аналогичным образом.

Каковы преимущества каждой библиотеки?

Мне очень нравится XStream библиотека. Она делает действительно хорошую работу по выводу довольно простого xml как результат предоставленного объекта Java. Она отлично подходит для воспроизведения объект обратно из xml. К тому же, одна из наших сторонних библиотек уже зависит от него в любом случае.

  • Мы решили использовать его, потому что хотели чтобы наш xml был читабельным для человека. Использование функции псевдонима делает это намного более приятным.

  • Вы можете расширить библиотеку, если если вы хотите, чтобы некоторая часть объекта десериализовывать более приятным способом. Мы сделали это в одном случае, чтобы файл был набор градусов, минут и секунд для широты и долготы, вместо двух двойников.

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

// определите ваши классы
public class Person {
  private String firstname;
  private PhoneNumber phone;
  // ... конструкторы и методы
}

public class PhoneNumber { private int код; private String number; // ... конструкторы и методы }

Затем используйте библиотеку для записи xml.

// инициализация библиотеки
XStream xstream = new XStream();
xstream.alias("person", Person.class); // elementName, Class
xstream.alias("phone", PhoneNumber.class);

// создаем свои объекты Person joe = new Person("Joe"); joe.setPhone(new PhoneNumber(123, "1234-456"));

// преобразование xml String xml = xstream.toXML(joe);

Ваш вывод будет выглядеть следующим образом:


  Joe
  
    123
    1234-456
  

Вернуться назад:

Person newJoe = (Person)xstream.fromXML(xml);

XMLEncoder предоставляется для сериализации Java-бобов. В последний раз, когда я использовал его, файл выглядел довольно отвратительно. Если вас действительно не волнует, как выглядит файл, это может и вы избежите зависимости от сторонних разработчиков, что тоже неплохо. Я ожидаю, что возможность сделать сериализацию более красивой будет более сложной задачей и для XMLEncoder.

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

package example;
, то в xml было бы "example.Person", а не просто "person".

Комментарии (3)

Другое предложение: рассмотреть возможность использования JAXB (http://jaxb.dev.java.net). Если вы с использованием JDK 1.6, пожалуйста, проверьте и"пакета javax.в формате XML.привязать" и для детали, поэтому нет необходимости в дополнительных внешних банок.

JAXB является довольно быстро. Мне тоже нравится кинокомпании xStream, но это'ы чуть медленнее. Кроме того, XMLEncoder-это небольшая игрушка (по сравнению с другими вариантами)... а если она работает, там'ы ничего плохого в ее использовании.

Также: одним из преимуществ JAXB является то, что вы также можете привязать документ (поддеревья) с ним; не надо создавать объект(ы) для всего файла. Для этого вам нужно использовать Стакс (интерфейс xmlstreamreader) для ссылки на корневой элемент поддерева, затем привязать. Не нужно использовать Sax, даже для самых больших файлов, пока он может быть обработан куска на кусок.

Комментарии (2)

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

Если использование памяти вызывает беспокойство (файл, содержащий XML, будет очень большим), я рекомендую SAX.

Если использование памяти не вызывает беспокойства (файл, содержащий XML, не будет очень большим), я бы использовал то, что включено в стандартную JRE (в данном случае XMLDecoder), просто чтобы убрать сторонние зависимости.

Комментарии (1)

Я бы также предпочел XStream, поскольку он действительно прост в использовании и расширении. Вы можете быстро начать, если вы используете стандартные настройки. Если вам нужно настроить поведение, у него очень чистый API и много точек расширения, так что у вас есть действительно тонкий контроль над тем, что вы хотите подправить, не вмешиваясь в другие части процесса маршалинга.

Поскольку XML, создаваемый XStream, выглядит красиво, ручное редактирование также просто. Если полученный результат не удовлетворяет вашим требованиям, а длинный список доступных Конвертеров не содержит того, что вам нужно, довольно просто написать свой собственный.

Большим плюсом является также хорошая документация на их домашней странице.

Комментарии (0)

Я всегда нахожу кинокомпании xStream очень заманчиво, потому что это's так легко идти. Однако неизменно я в конечном итоге заменить его. Это's действительно довольно глючная, и ее сбора можно использовать много работы.

В результате, я обычно переключиться к JAXB. Это'ы много более надежные, это'ы довольно много ошибок, и более гибким, чем кинокомпании xStream.

Комментарии (1)

Дополнение к @Джей ответа с примером:

Код:

PortfolioAlternateIdentifier identifier = new PortfolioAlternateIdentifier();
identifier.setEffectiveDate(new Date());
identifier.setSchemeCode("AAA");
identifier.setIdentifier("123456");

Выход через кинокомпании xStream:


 2014-05-02 20:14:15.961 IST
 AAA
 123456

Выход через XMLEncoder:

<?xml version="1.0" encoding="UTF-8"?> 




   1399041855961 



  123456 


    AAA 


Комментарии (0)

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

Комментарии (0)

Вы должны избегать XMLEncoder/XMLDecoder как от чумы, если вы'ре собирается быть сохранение нетривиальное количество объектов или ваша система должна быть многопоточной. См http://matthew.mceachen.us/blog/do-not-want-xmlencoder-129.html за жуткие подробности.

Если вы должны использовать XML, кинокомпании xStream-это здорово. Но спросите себя, если вам действительно нужно использовать XML. Здесь'с эталоном проекта сериализации, которые могут превратить вас в лучшего решения:

http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

Комментарии (0)