Answers:
2008解答 现在的“官方” Java API是JAXB-XML绑定的Java API。请参见Oracle教程。参考实现位于http://jaxb.java.net/
2018更新 注意,Java EE和CORBA模块在JDK9中的SE中已弃用,并将在JDK11中从SE中删除。因此,要使用JAXB,要么需要将其放置在您的现有企业级环境中(例如,由应用服务器捆绑),要么需要手动将其引入。
XStream非常擅长将对象序列化为XML,而无需进行大量配置和花费!(已获得BSD许可)。
我们在一个项目中使用它来替换普通的旧Java序列化,并且它几乎可以立即使用。
您可能需要查看简单XML序列化项目。这是我在.Net中找到的最接近System.Xml.Serialization的东西。
JAXB是JDK标准版本1.6+的一部分。因此FREE
,无需额外的库即可下载和管理。一个简单的例子可以在这里找到
XStream似乎已经死了。最近的更新是在2008年12月6日。
Simple
看起来像JAXB一样容易和简单,但是我找不到任何许可信息来评估它以供企业使用。
值得一提的是,从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;
}