XMLEncoder和XStream的相对优势是什么?
假设我想用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。这是一个序列化基准测试项目,可能会找到更好的解决方案:
段落数量不匹配