XStream 源码解析

本文深入探讨了XStream的功能、总体设计和详细设计,重点解析了Mapper的工作原理、Converter的查找与注册,以及XML如何转化为Java对象。此外,还介绍了提升XStream解析速度的策略,包括优化Converter查找、缓存Mapper和Converter、使用Xpp3Driver以及减少初始化时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目地址: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) 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值