Marshaller and Unmarshaller
正如 简介 中所说,marshaller 将对象序列化为 XML,而 unmarshaller 则将 XML 流反序列化为对象。本节描述了用于此目的的两个 Spring 接口。
他们的依赖包是
implementation group: 'org.springframework', name: 'spring-oxm', version: '5.3.15'
理解 Marshaller
Understanding Marshaller
Spring 在 org.springframework.oxm.Marshaller
接口后面抽象了所有的 marshalling 操作,其主要方法如下:
public interface Marshaller {
/**
* 将具有给定根的对象图装入提供的结果。
*/
void marshal(Object graph, Result result) throws XmlMappingException, IOException;
}
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
接口,下面的列表显示了这个接口:
public interface Unmarshaller {
/**
* 将给定的 Source 解压缩成一个对象图。
*/
Object unmarshal(Source source) throws XmlMappingException, IOException;
}
这个接口也有一个方法,它从给定的 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 映射的异常层次结构如下图所示: