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

时间:2020-03-06 14:23:06  来源:igfitidea点击:

假设我想用XML存储许多小的配置对象,并且我不太在乎格式。内置到JDK中的XMLDecoder类将起作用,并且据我所知,XStream以类似的方式起作用。

每个图书馆都有哪些优势?

解决方案

如果我们打算将所有这些配置对象存储在一个文件中,并且该文件将很大,那么上面概述的两个选项都可能会占用大量内存,因为这两个选项都需要将整个文件读入内存才能进行。反序列化。

如果需要考虑内存使用情况(包含XML的文件将非常大),建议使用SAX。

如果不关心内存使用情况(包含XML的文件不会很大),那么我将使用默认JRE(在本例中为XMLDecoder)附带的任何内容来删除第三方的依赖关系。

我真的很喜欢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
}

两分钟的教程总结了基本用法,但是在
为了将信息集中在一个地方,我将尝试对其进行汇总
在这里,只是短一点。

// 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);

然后使用该库写出xml。

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

To go back:
Person newJoe = (Person)xstream.fromXML(xml);

The XMLEncoder is provided for Java bean serialization.  The last time I used it, 
the file looked fairly nasty. If really don't care what the file looks like, it could
work for you and you get to avoid a 3rd party dependency, which is also nice.  I'd expect the possibility of making the serialization prettier would be more a challenge with the XMLEncoder as well.

XStream outputs the full class name if you don't alias the name. If the Person class above had package example;

输出将如下所示:

xml将具有" example.Person",而不仅仅是" person"。

我也更喜欢XStream,因为它确实易于使用和扩展。如果要使用默认设置,则可以快速开始。如果我们需要自定义行为,则它具有非常干净的API和许多扩展点,因此我们可以对要调整的内容进行精细控制,而不会干扰编组过程的其他部分。

由于XStream创建的XML看起来不错,因此手动编辑也很简单。如果输出不能满足需求,并且一长串可用的Converters中没有我们所需要的转换器,那么编写自己的转换器就非常简单。

另外,他们主页上的文档也很不错。

另一个建议:考虑使用JAXB(http://jaxb.dev.java.net)。如果我们使用的是JDK 1.6,则将其捆绑在一起,请查看" javax.xml.bind"以获取详细信息,因此无需其他外部jar。

JAXB相当快。我也喜欢XStream,但是它有点慢。而且,XMLEncoder有点像玩具(与其他选项相比)……但是,如果它起作用了,那么使用它就没有害处。

另外:JAXB的优点之一是我们还可以用它绑定部分文档(子树)。无需为整个文件创建对象。为此,我们需要使用Stax(XMLStreamReader)指向子树的根元素,然后进行绑定。只要可以逐块处理,就无需使用SAX,即使对于大多数大型文件也是如此。

Java还有一个新的实用程序类,旨在存储典型的配置的键-值配对集。它是旧样式,但非常简单方便。这是通过java.util.Properties类(带有序列化选项的Map对象)完成的。除非要存储整个对象,否则这可能就是我们所需要的。

我总是觉得XStream非常诱人,因为它很容易上手。但是,最终我总是要替换它。这确实很容易出错,并且其集合处理可能需要大量工作。

结果,我通常切换到JAXB。它比XStream强大得多,几乎没有错误,并且更灵活。

如果要持久保存大量对象,或者系统需要多线程,则应避免像瘟疫那样避免使用XMLEncoder / XMLDecoder。有关详细信息,请参见http://matthew.mceachen.us/blog/do-not-want-xmlencoder-129.html。

如果必须使用XML,那么XStream很棒。但是,问问自己是否真的需要使用XML。这是一个序列化基准测试项目,可能会找到更好的解决方案:

段落数量不匹配