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

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

每个图书馆有哪些优势?

我非常喜欢XStream库。 作为提供的Java对象的结果,它可以很好地输出相当简单的xml。 它也非常适合从xml中重现对象。 并且,无论如何,我们的第三方图书馆之一已经依赖它。

  • 我们选择使用它是因为我们希望我们的xml是人类可读的。 使用别名function可以使它更好。

  • 如果希望某个对象的某些部分以更好的方式反序列化,则可以扩展库。 我们在一个案例中做到了这一点,因此文件将具有经度和纬度的一组度,分和秒,而不是两个双打。

两分钟的教程总结了基本用法,但为了将信息保存在一个地方,我会试着总结一下,只是缩短一点。

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

您的输出将如下所示:

  Joe  123 1234-456   

回去:

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

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

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

 package example; 

xml将具有“example.Person”而不仅仅是“person”。

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

JAXB相当快。 我也喜欢XStream,但它有点慢。 此外,XMLEncoder是一个玩具(与其他选项相比)……但如果它有效,使用它没有任何害处。

另外:JAXB的一个好处是你也可以用它来绑定部分文档(子树); 无需为整个文件创建对象。 为此,您需要使用Stax(XMLStreamReader)指向子树的根元素,然后绑定。 即使对于大多数大文件,也不需要使用SAX,只要它可以通过块处理块。

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

如果考虑内存使用(包含XML的文件会非常大),我建议使用SAX 。

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

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

由于XStream创建的XML看起来不错,因此手动编辑也很简单。 如果输出不能满足您的需求,并且可用转换器的长列表不包含您需要的那个,那么编写自己的转换器相当简单。

一个很大的优点也是他们主页上的好文档。

我总觉得XStream非常诱人,因为它很容易上手。 但是,我总是最终更换它。 这真的很不错,它的集合处理可能会使用很多工作。

因此,我通常会切换到JAXB。 它非常强大,它几乎没有错误,比XStream更灵活。

除了@jay回答示例:

码:

 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的输出:

      1399041855961    123456   AAA    

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

你应该避免像瘟疫这样的XMLEncoder / XMLDecoder,如果你要保持一些非常重要的对象,或者你的系统需要multithreading。 有关可怕的细节,请参见http://matthew.mceachen.us/blog/do-not-want-xmlencoder-129.html 。

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

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