项目地址:XStream, 分析的版本: v1.4.11,Demo地址:TestStream, 相关jar下载地址
本文结构
1、功能介绍
2、总体设计
3、详细设计
4、如何提升XStream 解析速度
5、自定义Mapper和自定义Converter
6、总结
1、功能介绍
1.1简介
提供给Java使用的XML序列化工具
1.2 如何使用
public void testPopulationOfAnObjectGraphStartingWithALiveRootObject() throws Exception {
final XStream xstream = new XStream();
//设置允许类型带有$*字符
xstream.allowTypesByWildcard(this.getClass().getName() + "$*");
//开启注解自动检测
xstream.autodetectAnnotations(true);
final String xml = ""//
+ "<component>"
+ " <Host>host</Host>"
+ " <port>8000</port>"
+ "</component>";
//通过注解设置Component.class的别名为component
xstream.alias("component", Component.class);
//把XML转化成Component对象,(PS:如果想对象转化成XML,则使用toXML()方法)
final Component component = xstream.fromXML(xml);
}
public static class Component {
//设置host的别名为Host
@XStreamAlias("Host")
String host;
int port;
}
2、总体设计
2.1 XStream 总体由五部分组成
-
XStream 作为客户端对外提供XML解析与转换的相关方法。
-
AbstractDriver 为XStream提供流解析器和编写器的创建。目前支持XML(DOM,PULL)、JSON解析器。解析器HierarchicalStreamReader,编写器HierarchicalStreamWriter(PS:XStream默认使用了XppDriver)。
-
MarshallingStrategy 编组和解组策略的核心接口,两个方法:
marshal:编组对象图
unmarshal:解组对象图
TreeUnmarshaller 树解组程序,调用mapper和Converter把XML转化成java对象,里面的start方法开始解组,convertAnother方法把class转化成java对象。
TreeMarshaller 树编组程序,调用mapper和Converter把java对象转化成XML,里面的start方法开始编组,convertAnother方法把java对象转化成XML。
它的抽象子类AbstractTreeMarshallingStrategy有抽象两个方法
createUnmarshallingContext
createMarshallingContext
用来根据不同的场景创建不同的TreeUnmarshaller子类和TreeMarshaller子类,使用了策略模式,如ReferenceByXPathMarshallingStrategy创建ReferenceByXPathUnmarshaller,ReferenceByIdMarshallingStrategy创建ReferenceByIdUnmarshaller(PS:XStream默认使用ReferenceByXPathMarshallingStrategy)。 -
Mapper 映射器,XML的elementName通过mapper获取对应类、成员、属性的class对象。支持解组和编组,所以方法是成对存在real 和serialized,他的子类MapperWrapper作为装饰者,包装了不同类型映射的映射器,如AnnotationMapper,ImplicitCollectionMapper,ClassAliasingMapper。
-
ConverterLookup 通过Mapper获取的Class对象后,接着调用lookupConverterForType获取对应Class的转换器,将其转化成对应实例对象。DefaultConverterLookup是该接口的实现类,同时实现了ConverterRegistry的接口,所有DefaultConverterLookup具备查找converter功能和注册converter功能。所有注册的转换器按一定优先级组成由TreeSet保存的有序集合(PS:XStream 默认使用了DefaultConverterLookup)。
3、详细设计
StartUML写的XStreamUML原文件和图片下载地址
4、核心功能介绍
4.1 Xstream中Mapper的原理
####1. Mapper的构建过程
//XStream 构建映射器,通过MapperWrapper装饰者,将各个不同功能的映射器进行包装成Mapper
//通过映射器获取节点名的类型Class。
private Mapper buildMapper() {
Mapper mapper = new DefaultMapper(classLoaderReference);
if (useXStream11XmlFriendlyMapper()) {
mapper = new XStream11XmlFriendlyMapper(mapper);
}
mapper = new DynamicProxyMapper(mapper);
mapper = new PackageAliasingMapper(mapper);
mapper = new ClassAliasingMapper(mapper);
mapper = new ElementIgnoringMapper(mapper);
mapper = new FieldAliasingMapper(mapper);
mapper = new AttributeAliasingMapper(mapper);
mapper = new SystemAttributeAliasingMapper(mapper);
mapper = new ImplicitCollectionMapper(mapper, reflectionProvider);
mapper = new OuterClassMapper(mapper);
mapper = new ArrayMapper(mapper);
mapper = new DefaultImplementationsMapper(mapper);
mapper = new AttributeMapper(mapper, converterLookup, reflectionProvider);
mapper = new EnumMapper(mapper);
mapper = new LocalConversionMapper(mapper);
mapper = new ImmutableTypesMapper(mapper);
if (JVM.isVersion(8)) {
mapper = buildMapperDynamically("com.thoughtworks.xstream.mapper.LambdaMapper", new Class[]{
Mapper.class},
new Object[]{
mapper});
}
mapper = new SecurityMapper(mapper);
mapper = new AnnotationMapper(mapper, converterRegistry, converterLookup, classLoaderReference,
reflectionProvider);
mapper = wrapMapper((MapperWrapper)mapper);
mapper = new CachingMapper(mapper);
return mapper;
}
//PackageAliasingMapper继承自MapperWrapper
public PackageAliasingMapper(final Mapper wrapped)