XMLEncoder和XStream的相对优势是什么?

eri*_*son 5 java xml serialization xstream

假设我想在XML中存储许多小配置对象,我不太关心格式.内置到JDK中的XMLDecoder类可以工作,从我听到的,XStream以类似的方式工作.

每个图书馆有哪些优势?

Jay*_* R. 9

我非常喜欢XStream 库.由于提供了Java对象,它在输出相当简单的xml方面做得非常好.它也非常适合从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
}
Run Code Online (Sandbox Code Playgroud)

然后使用库写出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);
Run Code Online (Sandbox Code Playgroud)

您的输出将如下所示:

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

回去:

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

XMLEncoder是为Java bean序列化提供的.我最后一次使用它,文件看起来相当讨厌.如果真的不关心文件是什么样的,它可以为你工作,你可以避免第三方依赖,这也很好.我希望使用序列化更漂亮的可能性对XMLEncoder来说也是一个挑战.

如果不为名称添加别名,XStream将输出完整的类名.如果上面的Person类有

package example;
Run Code Online (Sandbox Code Playgroud) xml将具有"example.Person"而不仅仅是"person".


Gra*_*ner 1

如果您计划将所有这些配置对象存储在一个文件中,并且该文件将非常大,那么上面概述的两个选项可能会占用大量内存,因为它们都需要将整个文件读入内存以被反序列化。

如果内存使用是一个问题(包含 XML 的文件将非常大),我推荐SAX

如果内存使用不是问题(包含 XML 的文件不会很大),我将使用默认 JRE(在本例中为 XMLDecoder)中包含的任何内容来删除第 3 方依赖项。