XStream的使用
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,本文主要用于记录XStream的使用方式,特别是其中的"对象默认值"和Map转换器的使用1,添加Maven依赖 com.thoughtworks.xstream x
千家信息网最后更新 2025年02月04日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安全错误
数据库的锁怎样保障安全
mc空岛生存服务器怎么输入密码
华为网络安全服务上岗证有效期
数据库基础与应用实验题
优良网络安全应用
江阴正规网络技术服务价格
杭州齿呗互联网科技有限公司
花都区质量网络技术开发咨询报价
网络安全专题工作会议
衢州电子网络技术优势
新媒体与软件开发专业
广西友邦永信网络技术有限公司
网络安全宣传周哪年开始的
微信crm系统数据库
开展低年级网络安全主题班会
黑魂2服务器怎么登录
东莞尚睿网络技术有限公司
苹果手机不能安全连接服务器
江西企业软件开发服务价格
网络技术计划书例文
抚宁软件开发公司
天津服务器搬迁有哪些云服务器
上海黑马互联网科技有限公司
程序设计连接数据库
数据库应用系统是什么
惠州5g服务器标准机柜
怎么实现关系型数据库
中国网络安全组长是谁
数据库索引的组成
网络安全宣传画及标语
网络安全排查通讯报道