XStream的使用
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本文主要用于记录XStream的使用方式,特别是其中的"对象默认值"和Map转换器的使用1,添加Maven依赖 com.thoughtworks.xstream x
千家信息网最后更新 2026年11月02日XStream的使用
本文主要用于记录XStream的使用方式,特别是其中的"对象默认值"和Map转换器的使用
1,添加Maven依赖
com.thoughtworks.xstream xstream 1.4.11.1 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); } @Override public 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"); } @Override public 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(); } } @Override public 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();//需要XPP3库 // XStream xstream = new XStream(new DomDriver());// 不需要XPP3库 // XStream xstream = new XStream(new StaxDriver());// 不需要XPP3库开始使用Java6 XStream xstream = new XStream(new FieldDefaultValueProvider(),new DomDriver());// 创建Xstram对象 xstream.autodetectAnnotations(true); xstream.addPermission(AnyTypePermission.ANY); 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();}
对象
字段
字符
字符串
实例
文件
方式
目标
空字符
转换器
首尾
验证
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
湖南永感互联网科技有限公司
麻工互联网科技
深圳互联网络科技有限公司
狮子座互联网科技有限公司
亿账通互联网科技
盛创互联网科技有限公司
互联网科技创新企业排名
互联网巨头投资的硬核科技
互联网科技产品
互联网教育科技公司vipkid
黑科技闪耀互联网之光
杭州壁岐互联网科技有限公司
南博望互联网科技有限公司
工业互联网山东科技大学
互联网与数字科技关系
国产互联网科技公司
玉溪新华互联网科技怎么选
河南商务圈互联网科技有限公司
承德科技产业互联网平台
科技美学互联网 艺术
疫情对互联网科技公司影响
北京互联网科技公司
互联网科技金融公司
互联网金融科技委员会
盛创互联网科技有限公司
深圳国际航运科技和互联网
移动互联网年度科技创新
互联网科技与大数据专业
银行科技岗属于互联网吗
小牛互联网科技有限公司地址