【发布时间】:2010-09-07 08:08:31
【问题描述】:
.NET 的 XML 序列化的 Java 类似物是什么?
【问题讨论】:
-
啊,光荣的旧时代,像这样的单行问题在 SO 上受到欢迎。太有用了。没有那些“你尝试过什么?”/“提供详细信息”的废话,人们今天喜欢阅读。
标签: java xml serialization
.NET 的 XML 序列化的 Java 类似物是什么?
【问题讨论】:
标签: java xml serialization
如果您正在谈论对象的自动 XML 序列化,请查看 Castor:
Castor 是一个用于 Java[tm] 的开源数据绑定框架。它是 Java 对象、XML 文档和关系表之间的最短路径。 Castor 提供 Java 到 XML 的绑定、Java 到 SQL 的持久性等等。
【讨论】:
XStream 非常擅长将对象序列化为 XML,无需太多配置和金钱! (它在 BSD 许可下)。
我们在我们的一个项目中使用它来替换普通的旧 java 序列化,它几乎是开箱即用的。
【讨论】:
2008 年答案 用于此的“官方”Java API 现在是 JAXB - Java API for XML Binding。见Tutorial by Oracle。参考实现位于http://jaxb.java.net/
2018 年更新 请注意the Java EE and CORBA Modules are deprecated in SE in JDK9 and to be removed from SE in JDK11。因此,要使用 JAXB,它需要位于您现有的企业类环境中,例如您的应用服务器,否则需要手动引入。
【讨论】:
XMLBeans 如果您有 XML 架构,则效果很好。它为模式创建 Java 对象并创建易于使用的解析方法。
【讨论】:
您可能想查看Simple XML Serialization 项目。这是我在 .Net 中发现的最接近 System.Xml.Serialization 的东西。
【讨论】:
别忘了JiBX。
【讨论】:
JAXB 是 JDK 标准版 1.6+ 的一部分。所以它是FREE,没有额外的库可以下载和管理。
一个简单的例子可以找到here
XStream 似乎已经死了。最后一次更新是在 2008 年 12 月 6 日。
Simple 看起来和 JAXB 一样简单易用,但我找不到任何许可信息来评估它以供企业使用。
【讨论】:
如果您想要一个结构化解决方案(如 ORM),那么 JAXB2 是一个很好的解决方案。
如果你想要像 DOT NET 这样的序列化,那么你可以使用Long Term Persistence of JavaBeans Components
选择取决于序列化的使用。
【讨论】:
值得一提的是,从 1.4 版开始,Java 有了 java.beans.XMLEncoder 和 java.beans.XMLDecoder 类。这些类执行 XML 编码,这至少与 XML 序列化非常相似,并且在某些情况下可能会为您解决问题。
如果您的类的 getter 和 setter 遵循 JavaBeans 规范,那么此方法使用起来很简单,并且您不需要模式。有以下注意事项:
例如,采取以下声明:
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>
【讨论】:
java.beans.XMLDecoder 与用户提供的数据一起使用可能会在您的代码中引入任意代码执行漏洞。
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;
}
【讨论】: