.NET的XML序列化的Java模拟是什么?
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序列化"项目
您可能需要查看简单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规范,则此方法易于使用,并且不需要架构。有以下警告:
-
与普通的Java序列化一样
-
编码和解码在InputStream和OutputStream上运行
-
该过程使用熟悉的writeObject和readObject方法
-
与普通的Java序列化相反
-
编码和解码也会导致构造函数和初始化程序被调用
-
不管您的类是否实现了可序列化,编码和解码均有效
-
不考虑瞬态修饰符
-
仅适用于具有公共构造函数的公共类
例如,采用以下声明:
1 2 3 4 5 6 7 8 9
| 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;}
} |
执行此代码:
1 2 3 4 5 6 7
| 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(); |
将导致以下文件:
1 2 3 4 5 6 7 8 9 10 11
| <?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可以很好地工作。它为模式创建Java对象,并创建易于使用的解析方法。
如果您想要结构化的解决方案(例如ORM),那么JAXB2是一个很好的解决方案。
如果您想要像DOT NET这样的序列化,则可以使用JavaBeans组件的长期持久性
选择取决于序列化的使用。
不要忘记JiBX。
通常,如果需要创建可序列化为XML的对象,则通常使用jaxb或XMLBeans。现在,我可以看到XStream可能是非常有用的,因为它是非侵入性的并且具有非常简单的api。我会尽快使用它,并且可能会使用它。我注意到的唯一缺点是,我无法自行创建对象的ID进行交叉引用。
@巴拉克·席勒
感谢您发布指向XStream的链接!
如果您在谈论对象的XML自动序列化,请查看Castor:
Castor is an Open Source data binding framework for Java[tm]. It's the shortest path between Java objects, XML documents and relational tables. Castor provides Java-to-XML binding, Java-to-SQL persistence, and more.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| 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;
} |