假设我想在XML中存储许多小配置对象,我不太关心格式。 JDK中内置的XMLDecoder类可以工作,从我听到的内容,XStream以类似的方式工作。
每个图书馆有哪些优势?
答案 0 :(得分:9)
我真的很喜欢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
}
然后使用该库写出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);
您的输出将如下所示:
<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;
,则xml将具有“example.Person”而不仅仅是“person”。
答案 1 :(得分:4)
另一个建议:考虑使用JAXB(http://jaxb.dev.java.net)。如果您使用的是JDK 1.6,它会捆绑在一起,请查看“javax.xml.bind”以获取详细信息,因此无需额外的外部jar。
JAXB相当快。我也喜欢XStream,但它有点慢。此外,XMLEncoder是一个玩具(与其他选项相比)...但如果它有效,使用它没有任何害处。
另外:JAXB的一个好处是你也可以用它来绑定部分文档(子树);无需为整个文件创建对象。为此,您需要使用Stax(XMLStreamReader)指向子树的根元素,然后绑定。即使对于大多数大文件,也不需要使用SAX,只要它可以按块进行处理。
答案 2 :(得分:1)
如果您计划将所有这些配置对象存储在一个文件中,并且该文件非常大,则上面列出的两个选项都可能占用大量内存,因为它们都需要读取整个文件进入内存以进行反序列化。
如果需要关注内存(包含XML的文件会非常大),我建议SAX。
如果内存使用不是问题(包含XML的文件不会很大),我会使用默认JRE(在本例中为XMLDecoder)中包含的任何内容来删除第三方依赖项。
答案 3 :(得分:1)
我也更喜欢XStream,因为它非常易于使用和扩展。如果您使用默认设置,则可以快速启动。如果您需要自定义行为,它有一个非常干净的API和许多扩展点,因此您可以对要调整的内容进行非常精细的控制,而不会干扰编组过程的其他部分。
由于XStream创建的XML看起来不错,手动编辑也很简单。如果输出不能满足您的需求,并且可用的Converters的长列表不包含您需要的那个,那么编写自己的列表非常简单。
一个很大的优点还是他们homepage上的优秀文档。
答案 4 :(得分:1)
我总觉得XStream非常诱人,因为它很容易上手。但是,我总是最终取代它。这真的很糟糕,它的集合处理可以使用很多工作。
因此,我通常会切换到JAXB。它非常强大,它几乎没有错误,比XStream更灵活。
答案 5 :(得分:1)
添加@jay回答示例:
代码:
PortfolioAlternateIdentifier identifier = new PortfolioAlternateIdentifier();
identifier.setEffectiveDate(new Date());
identifier.setSchemeCode("AAA");
identifier.setIdentifier("123456");
使用XStream的输出:
<PortfolioAlternateIdentifier>
<effectiveDate>2014-05-02 20:14:15.961 IST</effectiveDate>
<schemeCode>AAA</schemeCode>
<identifier>123456</identifier>
</PortfolioAlternateIdentifier>
使用XMLEncoder的输出:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_38" class="java.beans.XMLDecoder">
<object class="PortfolioAlternateIdentifier">
<void property="effectiveDate">
<object class="java.util.Date">
<long>1399041855961</long>
</object>
</void>
<void property="identifier">
<string>123456</string>
</void>
<void property="schemeCode">
<string>AAA</string>
</void>
</object>
</java>
答案 6 :(得分:0)
Java还有一个新的实用程序类,旨在存储典型配置的Key-Value配对集。这是旧式但非常简单和方便。这是通过java.util.Properties类完成的,这是一个带有序列化选项的Map对象。除非您要存储整个对象,否则这可能就是您所需要的。
答案 7 :(得分:-1)
如果你要保留一些非常重要的对象或者你的系统需要多线程,你应该避免像瘟疫那样的XMLEncoder / XMLDecoder。有关可怕的详细信息,请参阅http://matthew.mceachen.us/blog/do-not-want-xmlencoder-129.html。
如果必须使用XML,XStream就很棒。但问问自己是否真的需要使用XML。这是一个序列化基准测试项目,可能会为您提供更好的解决方案:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking