【问题标题】:How do I serialize / deserialize a class in XML with Woodstox StAX 2如何使用 Woodstox StAX 2 序列化/反序列化 XML 中的类
【发布时间】:2011-05-11 22:23:10
【问题描述】:

我非常想存档,Java 中 how-to-serialize-deserialize-simple-classes-to-xml-and-back (C#) 中所做的事情。如果可能,我想避免为每个类编写序列化/反序列化方法。

比如serialize的一部分:

    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 转换。

【问题讨论】:

    标签: java xml xml-serialization stax woodstox


    【解决方案1】:

    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 与这些库一起使用。

    更多信息

    查看我的博客:

    【讨论】:

    • 你在这门学科上的知识令人印象深刻。
    • 感谢 Margus,我领导 XML 绑定解决方案已有好几年了(EclipseLink MOXy)。我还是两个 Java 相关标准的积极成员:JAXB (jcp.org/en/jsr/detail?id=222) 和 SDO (jcp.org/en/jsr/detail?id=235)。我强烈建议您使用 Java 中的标准解决方案,因为它可以更好地与企业 Java 堆栈的其余部分集成。例如,JAXB 是 JAX-WS(XML Web 服务)和 JAX-RS(RESTful Web 服务)的标准绑定层。如果您需要更多信息,请告诉我。
    • @BlaiseDoughan 正如您所提到的,如何设置 Schema 实例以在使用 JAXB 解组时针对 DTD 验证整个 xml,而不涉及创建验证器的 2 个步骤来验证然后解析?对此的任何指示都会有所帮助
    【解决方案2】:

    除了全面接受的答案之外,值得注意的是 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 格式的情况下,它可能最有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2011-05-12
      • 1970-01-01
      • 2021-12-12
      • 2019-04-24
      相关资源
      最近更新 更多