在Java中的XML序列化?

.NET的XML序列化的Java模拟是什么?

现在的“官方”Java API现在是JAXB – 用于XML绑定的Java API。 参见Oracle教程 。 该参考实现位于http://jaxb.java.net/

XStream非常适合将对象序列化为XML,而不需要太多configuration和金钱! (这是在BSD许可下)。

我们在我们的项目中使用它来取代普通的旧java序列化,它几乎开箱即用。

“简单的XML序列化”项目

你可能想看看简单的XML序列化项目。 这是我在.NET中findSystem.Xml.Serialization最接近的东西。

JAXB是JDK标准版本1.6+的一部分。 所以它是FREE ,没有额外的图书馆下载和pipe理。 一个简单的例子可以在这里find

XStream似乎已经死了。 最近的更新是在2008年12月6日。 Simple看起来像JAXB一样简单,但我找不到任何许可信息来评估它为企业使用。

值得一提的是,从1.4版本开始,Java拥有java.beans.XMLEncoder和java.beans.XMLDecoder类。 这些类执行的XML编码至less非常类似于XML序列化,并且在某些情况下可能会对您有用。

如果你的类坚持使用它的getter和setter的JavaBeans规范,这个方法很简单,而且你不需要schema。 有以下警告:

  • 和普通的Java序列化一样
    • 编码和解码在InputStream和OutputStream上运行
    • 该进程使用类似的writeObject和readObject方法
  • 与普通的Java序列化不同
    • 编码也解码导致构造函数和初始化器被调用
    • 编码和解码工作,无论你的类是否实现了Serializable
    • 瞬态修正不考虑
    • 只适用于具有公共构造函数的公共类

例如,采取以下声明:

 public class NPair { public NPair() { } int number1 = 0; int number2 = 0; public void setNumber1(int value) { number1 = value;} public int getNumber1() { return number1; } public void setNumber2(int value) { number2 = value; } public int getNumber2() {return number2;} } 

执行此代码:

 NPair fe = new NPair(); fe.setNumber1(12); fe.setNumber2(13); FileOutputStream fos1 = new FileOutputStream("d:\\ser.xml"); java.beans.XMLEncoder xe1 = new java.beans.XMLEncoder(fos1); xe1.writeObject(fe); xe1.close(); 

会导致以下文件:

 <?xml version="1.0" encoding="UTF-8"?> <java version="1.7.0_02" class="java.beans.XMLDecoder"> <object class="NPair"> <void property="number1"> <int>12</int> </void> <void property="number2"> <int>13</int> </void> </object> </java> 

如果您的XML有一个模式,那么XMLBeans的工作效果很好。 它为模式创buildJava对象并创build易于使用的parsing方法。

如果您正在讨论对象的自动XML序列化,请查看Castor :

Castor是Java [tm]的开源数据绑定框架。 这是Java对象,XML文档和关系表之间的最短path。 Castor提供Java-to-XML绑定,Java-to-SQL持久性等等。

通常我使用jaxb或XMLBeans,如果我需要创build可序列化到XML的对象。 现在,我可以看到XStream可能是非常有用的,因为它是非侵入性的,并且具有非常简单的API。 我很快就会玩,可能会使用它。 我注意到唯一的缺点是我不能创build对象的id我自己的交叉引用。

@巴拉克·席勒
感谢张贴链接到XStream!

别忘了JiBX 。

如果你想要一个结构化的解决scheme (如ORM),那么JAXB2是一个很好的解决scheme。

如果您想要像DOT NET这样的序列化,那么您可以使用JavaBeans组件的长期持久性

select取决于序列化的使用。

 public static String genXmlTag(String tagName, String innerXml, String properties ) { return String.format("<%s %s>%s</%s>", tagName, properties, innerXml, tagName); } public static String genXmlTag(String tagName, String innerXml ) { return genXmlTag(tagName, innerXml, ""); } public static <T> String serializeXML(List<T> list) { String result = ""; if (list.size() > 0) { T tmp = list.get(0); String clsName = tmp.getClass().getName(); String[] splitCls = clsName.split("\\."); clsName = splitCls[splitCls.length - 1]; Field[] fields = tmp.getClass().getFields(); for (T t : list) { String row = ""; try { for (Field f : fields) { Object value = f.get(t); row += genXmlTag(f.getName(), value == null ? "" : value.toString()); } } catch (IllegalAccessException e) { e.printStackTrace(); } row = genXmlTag(clsName, row); result += row; } } result = genXmlTag("root", result); return result; }