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