千家信息网

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();}
0