2021SC@SDUSC
在上篇文章中,我们分析到了processInstall方法下的processRestore方法。在processRestore方法中,我们看到了来自backup包的BackupImport类实例,在processRestore方法中,该实例调用了performImport方法,我们分析到了 File f = unzip(is);这行代码。在本篇文章中,我们将对performImport方法剩下的代码进行分析。
performImport
源码
// BackupImport.java
public void performImport(InputStream is) throws Exception {
...
// 上面的代码已经分析过,就省略了
// 下面的代码使用了Simple框架通过注册转换器来序列化第三方对象
// 我们会在下文介绍一下这个框架,主要选取一些与本项目代码相关的内容进行介绍
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
RegistryMatcher matcher = new RegistryMatcher();
Serializer simpleSerializer = new Persister(strategy, matcher);
matcher.bind(Long.class, LongTransform.class);
registry.bind(Date.class, DateConverter.class);
...
Simple序列化框架
Simple是一个在Java Bean与XML之间序列化和反序列化的轻量级工具
官网地址:http://simple.sourceforge.net/home.php
将Java Bean对象序列化为XML文件
为了将对象序列化为 XML,必须在该对象中放置一系列批注。这些批注告诉持久化者应如何序列化对象。例如,以下面显示的类为例。此处有三种不同的批注,一个用于描述根元素的名称,一个用于描述 XML 消息元素,以及一个用于 id 属性的最终批注。
@Root
public class Example {
@Element
private String text;
@Attribute
private int index;
public Example() {
super();
}
public Example(String text, int index) {
this.text = text;
this.index = index;
}
public String getMessage() {
return text;
}
public int getId() {
return index;
}
}
要序列化上述对象的实例,需要一个持久性器(Persister类)。然后,为持久化对象提供带批注对象的实例和输出结果,在此示例中为文件(File类)。其他输出格式可用于持久化器对象。
Serializer serializer = new Persister();
Example example = new Example("Example message", 123);
File result = new File("example.xml");
serializer.write(example, result);
使用转换器覆盖序列化
通常,需要序列化无法批注的对象。此类对象可能存在于第三方依赖项或包中。若要序列化这些对象,可以实现转换器对象。转换器可用于截获正常的序列化过程。
正常序列化过程的拦截是使用Strategy实现执行的,因此不构成核心序列化过程的一部分。相反,需要向持久化程序提供特定的策略。拦截正常序列化过程的另一种更透明的方法是使用另一种策略实现。RegistryStrategy允许在类和转换器之间注册绑定,不需要像前面的示例那样进行其他批注。下面是如何在类和转换器之间建立绑定的示例。
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(External.class, ExternalConverter.class);
可以看出,它使用了注册表类(Registry)在类和转换器间建立了绑定。我们要分析的代码和这段代码非常相似,所以应该也是起到同样的作用,即将Date类和DateConverter转换器进行建立绑定。
RegistryMatcher
RegistryMatcher提供了一个由注册表支持的简单匹配器,可以执行使类型与Transform类或实例相匹配的注册。如果注册了转换类,则在使用该类型的默认无参数构造函数进行请求时创建该转换类的实例,然后缓存该转换类,以便在未来的请求中重用它。
在我们的代码中,它将Long类和LongTransform类进行了绑定。同时,在Persister对象的构造函数中,Matcher将使持久服务器能够确定转换未注释的原语类型的正确方法。
Persister对象的构造函数用于创建序列化器对象,该对象将使用提供的匹配器进行自定义转换。这个持久化对象将使用提供的Strategy来拦截XML元素,以便读写持久化数据,比如文档的类名或版本。
总结
在本篇文章中,我们分析了performImport中序列化第三方对象的部分。学习了Simple序列化框架的一些知识,有助于我们更好地理解本项目的代码。在下篇文章中,我们将对performImport中剩下的代码进行分析。