Каковы относительные преимущества XMLEncoder и XStream? - PullRequest
5 голосов
/ 18 сентября 2008

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

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

Ответы [ 8 ]

9 голосов
/ 19 сентября 2008

Мне очень нравится XStream библиотека. Это действительно хорошая работа по выводу довольно простого XML в результате предоставленного объекта Java. Это прекрасно работает для воспроизведения объект обратно из XML, а также. И одна из наших сторонних библиотек все равно уже зависело от этого.

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

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

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

// define your classes
public class Person {
  private String firstname;
  private PhoneNumber phone;
  // ... constructors and methods
}

public class PhoneNumber {
  private int code;
  private String number;
  // ... constructors and methods
}

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

// initial the libray
XStream xstream = new XStream();
xstream.alias("person", Person.class); // elementName, Class
xstream.alias("phone", PhoneNumber.class); 

// make your objects
Person joe = new Person("Joe");
joe.setPhone(new PhoneNumber(123, "1234-456"));

// convert xml
String xml = xstream.toXML(joe);

Ваш вывод будет выглядеть так:

<code><person>
  <firstname>Joe</firstname>
  <phone>
    <code>123</code>
    <number>1234-456</number>
  </phone>
</person>

Чтобы вернуться:

<code>Person newJoe = (Person)xstream.fromXML(xml);

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

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

package example;
, xml будет иметь "example.Person" вместо "person".
4 голосов
/ 10 февраля 2009

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

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

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

1 голос
/ 02 мая 2014

Дополнение к @jay ответу с примером:

Код:

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

Вывод с использованием XStream:

<PortfolioAlternateIdentifier>
 <effectiveDate>2014-05-02 20:14:15.961 IST</effectiveDate>
 <schemeCode>AAA</schemeCode>
 <identifier>123456</identifier>
</PortfolioAlternateIdentifier>   

Вывод с использованием XMLEncoder:

<?xml version="1.0" encoding="UTF-8"?> 
 <java version="1.6.0_38" class="java.beans.XMLDecoder"> 
   <object class="PortfolioAlternateIdentifier"> 
    <void property="effectiveDate"> 
  <object class="java.util.Date"> 
   <long>1399041855961</long> 
  </object> 
    </void> 
 <void property="identifier"> 
  <string>123456</string> 
 </void> 
   <void property="schemeCode"> 
    <string>AAA</string> 
   </void> 
  </object> 
</java> 
1 голос
/ 23 сентября 2009

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

В результате я обычно переключаюсь на JAXB. Он намного более надежный, без ошибок и более гибкий, чем XStream.

1 голос
/ 19 сентября 2008

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

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

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

1 голос
/ 18 сентября 2008

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

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

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

0 голосов
/ 25 марта 2010

Вам следует избегать 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 голосов
/ 23 сентября 2009

Java также имеет новый служебный класс, предназначенный для хранения парных наборов Key-Value, типичных для конфигураций. Это старый стиль, но очень простой и удобный. Это делается с помощью класса java.util.Properties , объекта Map с параметрами сериализации. Это может быть все, что вам нужно, если вы не храните целые объекты.

...