我正在尝试归档,在Java中how-to-serialize-deserialize-simple-classes-to-xml-and-back(C#)中已经完成了什么。如果可能的话,我想避免为每个类编写序列化/反序列化方法。
例如,序列化的一部分:
XMLOutputFactory xof = null;
XMLStreamWriter2 writer = null;
try {
resp.setContentType("text/plain");
xof = XMLOutputFactory.newInstance();
writer = (XMLStreamWriter2) //
xof.createXMLStreamWriter(resp.getOutputStream());
writer.writeStartDocument("1.0");
writer.writeStartElement("data");
//
// Magic happens here.
//
writer.writeEndElement();
writer.writeEndDocument();
} catch (XMLStreamException e) {
e.printStackTrace();
resp.sendError(1, "Problem 1 occured.");
} finally {
try {
writer.flush();
writer.close();
} catch (XMLStreamException e) {
e.printStackTrace();
resp.sendError(2, "Problem 2 occured.");
}
}
不是这个问题的一部分,因为我试图逐一解决问题,但可能会让你了解我正在尝试做什么。当我反序列化时,我还想检查输入是否有效。最终我想使用序列化形式的XSLT转换。
答案 0 :(得分:4)
JAXB是将Java对象序列化为XML的方式。以下内容将帮助您入门:
JAXB实施
此标准有多种实现方式:
Woodstox StAX 2
JAXB接受许多输入/输出格式,包括StAX。
<强>验证强>
使用Unmarshaller将XML转换为对象,并使用Marshaller将对象转换为XML。您可以设置javax.xml.validation.Schema的实例以在这些操作期间验证输入。
您也可以直接使用JAXB使用javax.xml.validation API,请查看以下示例:
<强> XSLT 强>
Java中使用javax.xml.transform库来执行XSLT转换。 JAXB旨在使用JAXBSource和JAXBResult来处理这些库。
了解更多信息
查看我的博客:
答案 1 :(得分:0)
除了全面接受的答案之外,值得注意的是Woodstox(或任何Stax2实现)实际上可以验证输入和输出;有关示例代码,请参阅this blog entry。一个好处是您还可以对Relax NG进行验证(默认情况下JAXB使用的JAXP解析器不支持AFAIK)或DTD。
另外:有一个名为Jackson-xml-databinder的新项目(Jackson JSON处理器的衍生产品)使用Stax2解析器(如Woodstox或Aalto)实现“mini-JAXB”(完整JAXB功能的子集) 。主要优点是比JAXB实现更强大的数据绑定部分甚至更好的性能;缺点是它不够成熟,并且不支持所有XML特定方面。在支持JSON和XML格式的情况下,它可能最有用。