⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 javabeanconverter.java

📁 xstream是一个把java object序列化成xml文件的开源库,轻便好用
💻 JAVA
字号:
package com.thoughtworks.xstream.converters.javabean;import com.thoughtworks.xstream.alias.ClassMapper;import com.thoughtworks.xstream.converters.ConversionException;import com.thoughtworks.xstream.converters.Converter;import com.thoughtworks.xstream.converters.MarshallingContext;import com.thoughtworks.xstream.converters.UnmarshallingContext;import com.thoughtworks.xstream.io.HierarchicalStreamReader;import com.thoughtworks.xstream.io.HierarchicalStreamWriter;/** * Can convert any bean with a public default constructor. BeanInfo are not * taken into consideration, this class looks for bean patterns for simple * properties */public class JavaBeanConverter implements Converter {    /**     * TODO:     *  - use bean introspection instead of reflection.     *  - support indexed properties     *  - ignore default values     *  - use BeanInfo     */    private ClassMapper classMapper;    private String classAttributeIdentifier;    private BeanProvider beanProvider;    public JavaBeanConverter(ClassMapper classMapper, String classAttributeIdentifier) {        this.classMapper = classMapper;        this.classAttributeIdentifier = classAttributeIdentifier;        this.beanProvider = new BeanProvider();    }    /**     * Only checks for the availability of a public default constructor.     * If you need stricter checks, subclass JavaBeanConverter     */    public boolean canConvert(Class type) {        return beanProvider.canInstantiate(type);    }    public void marshal(final Object source, final HierarchicalStreamWriter writer, final MarshallingContext context) {        beanProvider.visitSerializableProperties(source, new BeanProvider.Visitor() {            public void visit(String propertyName, Class fieldType, Object newObj) {                if (newObj != null) {                    writeField(propertyName, fieldType, newObj);                }            }            private void writeField(String propertyName, Class fieldType, Object newObj) {                writer.startNode(classMapper.serializedMember(source.getClass(), propertyName));                Class actualType = newObj.getClass();                Class defaultType = classMapper.defaultImplementationOf(fieldType);                if (!actualType.equals(defaultType)) {                    writer.addAttribute(classAttributeIdentifier, classMapper.serializedClass(actualType));                }                context.convertAnother(newObj);                writer.endNode();            }        });    }    public Object unmarshal(final HierarchicalStreamReader reader, final UnmarshallingContext context) {        final Object result = instantiateNewInstance(context);        while (reader.hasMoreChildren()) {            reader.moveDown();            String propertyName = classMapper.realMember(result.getClass(), reader.getNodeName());            boolean propertyExistsInClass = beanProvider.propertyDefinedInClass(propertyName, result.getClass());            Class type = determineType(reader, result, propertyName);            Object value = context.convertAnother(result, type);            if (propertyExistsInClass) {                beanProvider.writeProperty(result, propertyName, value);            }            reader.moveUp();        }        return result;    }    private Object instantiateNewInstance(UnmarshallingContext context) {        Object result = context.currentObject();        if (result == null) {            result = beanProvider.newInstance(context.getRequiredType());        }        return result;    }    private Class determineType(HierarchicalStreamReader reader, Object result, String fieldName) {        String classAttribute = reader.getAttribute(classAttributeIdentifier);        if (classAttribute != null) {            return classMapper.realClass(classAttribute);        } else {            return classMapper.defaultImplementationOf(beanProvider.getPropertyType(result, fieldName));        }    }    public static class DuplicateFieldException extends ConversionException {        public DuplicateFieldException(String msg) {            super(msg);        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -