4

我非常想存档,在 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 转换。

4

2 回答 2

4

JAXB 是您将 Java 对象序列化为 XML 的方式。以下内容将帮助您入门:

JAXB 实现

该标准有多种实现方式:

伍德斯托克斯 StAX 2

JAXB 接受许多输入/输出格式,包括 StAX。

验证

使用 Unmarshaller 将 XML 转换为对象,并使用 Marshaller 将对象转换为 XML。您可以设置 javax.xml.validation.Schema 的实例以在这些操作期间验证输入。

您还可以直接将 javax.xml.validation API 与 JAXB 一起使用,请查看以下示例:

XSLT

javax.xml.transform 库在 Java 中用于执行 XSLT 转换。JAXB 旨在使用 JAXBSource 和 JAXBResult 与这些库一起工作。

了解更多信息

看看我的博客:

于 2010-11-18T10:00:40.210 回答
0

除了全面接受的答案之外,值得注意的是 Woodstox(或任何 Stax2 实现)实际上可以验证输入和输出。有关示例代码,请参阅此博客条目。一个好处是您还可以针对 Relax NG(JAXB 默认使用的 JAXP 解析器不支持 AFAIK)或 DTD 进行验证。

另外:还有一个名为Jackson-xml-databinder(Jackson JSON 处理器的衍生产品)的新项目,它使用 Stax2 解析器(如 Woodstox 或 Aalto)实现“mini-JAXB”(完整 JAXB 功能的子集)。主要好处是比 JAXB 实现更强大的数据绑定部分和更好的性能;缺点是它不够成熟,并且不支持所有 XML 特定方面。在同时支持 JSON 和 XML 格式的情况下,它可能最有用。

于 2011-01-05T22:02:08.010 回答