Marshaller and Unmarshaller

正如 简介 中所说,marshaller 将对象序列化为 XML,而 unmarshaller 则将 XML 流反序列化为对象。本节描述了用于此目的的两个 Spring 接口。

他们的依赖包是

  1. implementation group: 'org.springframework', name: 'spring-oxm', version: '5.3.15'

理解 Marshaller

Understanding Marshaller

Spring 在 org.springframework.oxm.Marshaller接口后面抽象了所有的 marshalling 操作,其主要方法如下:

  1. public interface Marshaller {
  2. /**
  3. * 将具有给定根的对象图装入提供的结果。
  4. */
  5. void marshal(Object graph, Result result) throws XmlMappingException, IOException;
  6. }

Marshaller 接口有一个主方法,它将给定的对象打包到一个给定的 javax.xml.transform.Result。结果是一个标记接口,基本上代表了一个XML 输出的抽象。具体的实现封装了各种 XML 表示,如下表所示:

Result 实现 Wraps XML representation
DOMResult org.w3c.dom.Node
SAXResult org.xml.sax.ContentHandler
StreamResult java.io.File, java.io.OutputStream, or java.io.Writer

:::info 尽管 marshal()方法接受一个普通对象作为它的第一个参数,但大多数 Marshaller 实现不能处理任意的对象。相反,一个对象类必须在映射文件中被映射,用注解标记,在 marshaller 中注册,或者有一个共同的基类。请参考本章后面的章节,确定你的 O-X 技术是如何管理的。 :::

理解 Unmarshaller

Understanding Unmarshaller

与 Marshaller 类似,我们有 org.springframework.oxm.Unmarshaller接口,下面的列表显示了这个接口:

  1. public interface Unmarshaller {
  2. /**
  3. * 将给定的 Source 解压缩成一个对象图。
  4. */
  5. Object unmarshal(Source source) throws XmlMappingException, IOException;
  6. }

这个接口也有一个方法,它从给定的 javax.xml.transform.Source(一个 XML 输入抽象)中读取并返回读取的对象。与 Result 一样,Source 是一个标记接口,它有三个具体的实现。如下表所示,每个都包装了一个不同的 XML 表示法:

Source implementation Wraps XML representation
DOMSource org.w3c.dom.Node
SAXSource org.xml.sax.InputSource, and org.xml.sax.XMLReader
StreamSource java.io.File, java.io.InputStream, or java.io.Reader

尽管有两个独立的 marshalling 接口(Marshaller 和 Unmarshaller),Spring-WS 的所有实现都在一个类中实现。这意味着你可以将一个 marshaller 类连接起来,并在你的 applicationContext.xml 中把它作为 marshaller 和 unmarshaller 来引用。

理解 XmlMappingException

Understanding XmlMappingException

Spring 将底层 O-X 映射工具的异常转换为它自己的异常层次结构,XmlMappingException 是根异常。这些运行时异常包裹着原始异常,因此不会丢失任何信息。

此外,MarshallingFailureException 和 UnmarshallingFailureException 提供了 Marshalling 和 unmarshalling 操作之间的区别,尽管底层的 O-X 映射工具没有这样做。

O-X 映射的异常层次结构如下图所示:
image.png