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

时间:2008-09-18 19:30:27

标签: java xml serialization xstream

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

每个图书馆有哪些优势?

8 个答案:

答案 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