本文主要用于记录XStream的使用方式,特别是其中的“对象默认值”和Map转换器的使用

1,添加Maven依赖

<dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.11.1</version>
</dependency>

2,创建可以使用默认值的对象

import java.lang.reflect.Field;import com.thoughtworks.xstream.converters.reflection.ObjectAccessException;
import com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;public class FieldDefaultValueProvider extends PureJavaReflectionProvider {/*** @param object 目标类的实例* @param fieldName XML中显示指明的字段* @param definedIn 父类或者类本身*/@Override  public void writeField(Object object, String fieldName, Object value, Class definedIn) {Field field = fieldDictionary.field(object.getClass(), fieldName, definedIn);//返回存在于xml中的字段  validateFieldAccess(field);//验证字段可以被访问 try {  if (value instanceof String) {String trim = ((String)value).trim();//字符串首尾去空if(trim.length()==0)//如果是空字符串,则不做赋值,使用默认初始值return;field.set(object,trim);  }else{field.set(object, value);  }} catch (IllegalArgumentException e) {  throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);  } catch (IllegalAccessException e) {  throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);  }  }
}

3,创建用于转换Map的对象

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.mapper.Mapper;public class MapCustomConverter extends AbstractCollectionConverter {public MapCustomConverter(Mapper mapper) {super(mapper);}@Overridepublic boolean canConvert(Class type) {return type.equals(HashMap.class) || type.equals(Hashtable.class)|| type.getName().equals("java.util.LinkedHashMap") || type.getName().equals("sun.font.AttributeMap");}@Overridepublic void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {Map map = (Map) source;for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {Entry entry = (Entry) iterator.next();ExtendedHierarchicalStreamWriterHelper.startNode(writer, "property", Entry.class);writer.addAttribute("key", entry.getKey().toString());writer.addAttribute("value", entry.getValue().toString());writer.endNode();}}@Overridepublic Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {Map map = (Map) createCollection(context.getRequiredType());populateMap(reader, context, map);return map;}protected void populateMap(HierarchicalStreamReader reader, UnmarshallingContext context, Map map) {while (reader.hasMoreChildren()) {reader.moveDown();Object key = reader.getAttribute("key");Object value = reader.getAttribute("value");map.put(key, value);reader.moveUp();}}
}

4,创建XStream对象

private static XStream getXStream() {XStream xstream = new XStream(new FieldDefaultValueProvider(),new DomDriver());// 创建Xstram对象xstream.autodetectAnnotations(true);xstream.registerConverter(new MapCustomConverter(new DefaultMapper(new ClassLoaderReference(XStream.class.getClassLoader()))));XStream.setupDefaultSecurity(xstream);xstream.allowTypes(new Class[] { CollectTaskMeta.class, FtpConfig.class, TaskParallel.class,TaskRootConfig.class, Sql.class });xstream.processAnnotations(new Class[] { CollectTaskMeta.class, FtpConfig.class, TaskParallel.class,TaskRootConfig.class, Sql.class });return xstream;}

5,使用XStream来解析文件

import org.springframework.util.ResourceUtils;XStream xstream = getXStream();
TaskRootConfig meteInfo = null;
try {meteInfo = (TaskRootConfig) xstream.fromXML(ResourceUtils.getFile("classpath:taskconfig.xml"));
} catch (FileNotFoundException e) {e.printStackTrace();
}

转载于:https://blog.51cto.com/dengshuangfu/2336745

XStream的使用相关推荐

  1. java list 自定义类型转换_java – 可以从List生成平面XML结构的XStream自定义转换器?...

    我正在使用XStream,并且有一个类如下的字段: private Map data; 我想生成这样的XML输出: test data test data test data 所以我希望map键成为元 ...

  2. 看看XStream注解

    前文展示了使用别名更改XML展示内容,在这一节,可以使用注解更简单的更改XML展示. (1)最简单的注解示例 1. 输出响应消息 package com.favccxx.favsoft.pojo; p ...

  3. comsat java_java-com.thoughtworks.xstream.converters.ConversionExce...

    [EDITED] 我正在处理的项目是Java J2EE中的3个文件夹项目,带有servlet和Hibernate以实现持久性.结构如下:-管理员->具有bean和HTML / CSS的主程序-J ...

  4. 用 XStream 序列化/反序列化 XML 为 Java 对象(实例)

    用 XStream 序列化/反序列化 XML 为 Java 对象(实例) Posted on 2007-06-05 19:06 Stephen Wong 阅读(1224) 评论(0)  编辑 收藏 网 ...

  5. XStream 用法汇总

    XStream是一家Java对象和XML转换工具,很好很强大.它提供了所有的基本型.排列.收集和其他类型的支持,直接转换.因此XML在数据交换经常使用.对象序列化(和Java对象的序列化技术有着本质的 ...

  6. Xstream util xml 与 bean之间互转

    package com.demo.util;import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.mappe ...

  7. 【XStream】XStream 忽略不重要点元素

    XStream 是一个伟大的库来创建 XML 对象,反之亦然,和我使用它的很多的领域之一是存储配置.一个问题是,XStream 已被忽略字段序列化对象,而不是相反时 - - 例如,如果它发现在您的类中 ...

  8. Java对象表示方式2:XStream实现对对象的XML化

    前言 上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包 ...

  9. XML,Object,Json分析转换Xstream采用

    XML,Object,Json转换之浅析Xstream的使用 请尊重他人的劳动成果,转载请注明出处:XML,Object,Json转换之浅析Xstream的使用 XStream的是一个简单的库.主要用 ...

  10. Xstream解析报文

    xs.autodetectAnnotations(true); /*** xml解析函数* @param String xml信息* @return String 接口返回信息*/public sta ...

最新文章

  1. 主要元素(超过一半元素)
  2. console线驱动安装_centos7安装docker
  3. /org/gnome/Terminal/Factory0: Could not connec
  4. mysql操作语句now_【MySQL数据库开发之二】MySQL 基础语句的书写与操作!
  5. mysql sql len_MySQL的查询计划中ken_len的值计算方法
  6. Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换
  7. 软件工程博客---团队项目---个人设计2(算法)
  8. html侧滑菜单mui,mui侧滑菜单点击含有mui-action-menu类的控件无法实现侧滑
  9. (王道408考研数据结构)第七章查找-第二节3:分块查找
  10. 26 SD配置-主数据-信用管理-指定信用控制区域及信用部分
  11. maven deploy到nexus报错:Return code is: 401, ReasonPhrase:Unauthorized
  12. html标记语言 --超链接
  13. Play framework(二)
  14. JAVA第11章枚举与泛型总结
  15. 3dmax 单位设置 系统单位设置和显示单位比例
  16. win7安装java环境(详细步骤)
  17. 解决手机浏览器无法显示本地html文件
  18. APIO2019 打铁记
  19. 刷 LeetCode 吃力正常吗?
  20. 我当程序员一天,就多陪你一天吧

热门文章

  1. react form表单 input和textarea用法
  2. javascript设计模式研究学习-设计模式类别
  3. 计算机组成原理「一」计算机系统概述
  4. 第1关:创建/删除节点
  5. 7-9 计算摄氏温度 (5 分)
  6. 数据库(1)MySQL安装
  7. c语言 office 二级成绩查询,【2019年9月辽宁计算机二级考试成绩查询入口】- 环球网校...
  8. idea安装sbt插件linux,【idea】kafkasbt+idea安装配置与测试
  9. RN子组件获取redux数据
  10. 软件工程—个人作业(8)