`
winnie825
  • 浏览: 120445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

xstream自定义Converter的优化

阅读更多

针对list类型的自定义Converter进行优化,提供参数实现Converter的复用。

首选对自定义Converter进行改造

public class OrgIDConverter implements Converter {

    // 节点名称
    private String nodeName;
    
    // 构造方法
    public OrgIDConverter(String nodeName) {
        super();
        this.nodeName = nodeName;
    }
    
	@SuppressWarnings("unchecked")
	public void marshal(Object value, HierarchicalStreamWriter writer,
			MarshallingContext arg2) {
	    // 将Object向下转型,因为有canConvert方法的判断,所以不用instanceOf判断
		List<String> list = (List<String>) value;
		
        for (String subval : list) {
            // 将属性转换为自定义名称,不同的List集合只用在converter声明时提供参数即可
            writer.startNode(nodeName);
            writer.setValue(subval);
            writer.endNode();
        } 
	}

	public Object unmarshal(HierarchicalStreamReader reader,
			UnmarshallingContext context) {
	    // 声明List集合,用于接受xml的orgID元素并存储
		List<String> list = new ArrayList<String>();
        while (reader.hasMoreChildren()) {
            reader.moveDown();
            String key = reader.getNodeName();
            String value = null;
            // 这一步可以省略,直接使用else内容,if的内容是orgID下还有层元素,嵌套遍历
            if (reader.hasMoreChildren()) {
                value = (String)unmarshal(reader, context);
            } else {
                value = reader.getValue();
            }
            list.add(value);
            reader.moveUp();
        }
        return list;
	}

	public boolean canConvert(Class type) {
	    // 判断传入class的类型,注意:一定要使用声明类(List不能通过)
		return type.equals(ArrayList.class); 
	}

}

 

修改注册方法,在实体类中进行注册:

public class InfoTest {
    
    public static void main(String[] args) {

        XStream stream = new XStream();
        stream.alias("info", Info.class);
        // 使用自定义Converter
        stream.registerLocalConverter(Info.class, "orgIDs", new OrgIDConverter("orgID"));
        stream.registerLocalConverter(Info.class, "roleIDs", new OrgIDConverter("roleID"));
//        stream.alias("orgID", String.class);
//        stream.alias("roleID", String.class); ///:xstream会已最后一个对String类型的名称,命名所有String类型
        
        
        
        Info info = new Info();
        List<String> orgIDs = new ArrayList<String>();
        orgIDs.add("020120214");
        orgIDs.add("020120215");
        info.setOrgIDs(orgIDs);
        
        List<String> roleIDs = new ArrayList<String>();
        roleIDs.add("020120216");
        roleIDs.add("020120217");
        info.setRoleIDs(roleIDs);
        
        System.out.println(stream.toXML(info));
    }

}

 

之前文章的链接:http://winnie825.iteye.com/admin/blogs/1432064

分享到:
评论

相关推荐

    xstream 的高级用法,自定义输出结构

    《XStream的高级用法与自定义输出结构详解》 ...本文仅对XStream的高级用法进行了概述,具体实践时还需要根据项目需求进行调整和优化。更多关于XStream的详细信息,可以通过提供的博文链接深入学习。

    使用XStream是实现XML与Java对象的转换(4)--转换器

    要创建一个自定义转换器,你需要继承XStream的Converter或HierarchicalStreamConverter接口,并实现其必要的方法。例如,如果你有一个Date类型的字段,想要将其以自定义格式输出,你可以创建一个LocalConverter并...

    xstream解析依赖包

    XStream通过使用自定义的转换器(Converter)和数据类型的安全性,使得这个转换过程既灵活又安全。例如,XStream提供了内置的转换器处理基本类型、集合、日期等,同时也支持用户自定义转换器以处理特定的复杂对象。 ...

    使用XStream操作xml教程

    XStream允许自定义类型转换器以处理特定类型的数据,例如日期。创建一个继承`XStreamConverter`的类,并注册到XStream实例: ```java import com.thoughtworks.xstream.converters.Converter; import ...

    XStream使用例子

    在本文中,我们将深入探讨XStream的使用方法,包括它的核心概念、配置、安全性和性能优化。 **1. 序列化到XML** XStream的核心功能是能够将Java对象转换成XML。首先,我们需要导入XStream库,并创建一个XStream...

    xstream-1.4.2

    3. **自定义转换器**:通过实现`com.thoughtworks.xstream.converters.Converter`接口,用户可以自定义对象的XML表示方式。 4. **排除字段**:使用`xstream.omitField()`方法可以排除特定字段不参与序列化和反序列...

    xstream-distribution-1.4.15-bin.zip

    内置的Converter支持多种常见的Java类型,开发者也可以自定义Converter处理特定类型的对象。 - **HierarchicalStreamWriter**:用于生成XML的接口,提供写入XML节点的方法,XStream使用它将Java对象转换为XML流。 ...

    xstream-1.4-API

    XStream 1.4 版本在之前的版本基础上进行了优化和增强,使其更加稳定和高效。本文将深入探讨 XStream 1.4 的主要功能、API 使用方法以及一些关键概念。 **1. XStream 基本原理** XStream 的工作原理是通过反射和...

    xStream-1.31 jar包

    对于自定义类型,开发者可以通过继承`com.thoughtworks.xstream.converters.Converter`接口并实现其方法来自定义转换逻辑。 接下来,我们谈谈xStream在处理XML时的特点。xStream的XML输出格式简洁明了,易于阅读,...

    xstream-distribution-1.4.7-bin.zip

    4. **自定义序列化和反序列化**:开发者可以通过实现 `Converter` 接口来自定义对象的 XML 表示,这提供了极大的灵活性。 5. **XML 格式控制**:XStream 支持多种 XML 格式风格,如 compact、human-readable 或 ...

    xstream-distribution-1.4.10-bin.zip

    1. 自定义类型转换器:通过实现`Converter`接口,可以创建自定义的类型转换逻辑,处理复杂的对象或自定义类型。 2. JSON支持:除了XML,XStream还支持JSON格式的序列化和反序列化,这在与JavaScript或现代Web服务...

    xstream源码

    - **Converter**: 转换器是XStream的核心,它们负责将Java对象与XML元素之间进行映射。XStream内建了一些标准转换器,如基本类型转换器、集合和数组转换器等。 - **HierarchicalStreamDriver**: 这个接口定义了...

    xstream-1.3.1.jar

    XStream 1.3.1版本是在XStream的长期发展过程中的一次重要更新,可能包含了一些bug修复、性能优化以及新的特性和改进。 XStream的工作原理主要基于两个关键概念:转换器(Converter)和绑定(Aliasing)。转换器是...

    转载 xStream完美转换XML、JSON

    2. 创建一个自定义的`Converter`来处理JSON转换: ```java import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.core.util.QuickWriter; import ...

    xstream-1.4.4

    4. **自定义转换策略**:通过实现`Converter`接口或使用`registerConverter()`方法,可以定制特定类型的转换逻辑。 四、最佳实践 1. **安全配置**:在生产环境中,应启用安全模式,防止XML注入攻击。可以通过`...

    dom4j、XStream的jar包

    3. **自定义转换**:如果需要自定义XML元素的名称或者值,可以通过实现`Converter`接口来自定义转换逻辑。 4. **类型安全**:XStream允许设置安全模式,防止反序列化时的安全漏洞。 5. **XML格式**:XStream生成的...

    XStream笔计rar.rar

    对于自定义对象,开发者可以通过实现`com.thoughtworks.xstream.converters.Converter`接口来自定义转换逻辑。 2. **HierarchicalStreamDriver**:驱动程序是XStream的另一个关键组件,它负责将XML流解析为对象树或...

    xstream1.4.8源码和jar

    XStream的核心概念是“转换器(Converter)”,它是连接Java对象和XML表示的关键组件。转换器负责将Java对象的属性和类型映射到XML元素和属性上,反之亦然。XStream提供了一套内置的转换器,支持基本数据类型、集合...

    xml操作之xstream

    虽然XStream不能对XML格式进行太多限制,但可以通过实现`Converter`接口来自定义对象的序列化和反序列化行为。这在处理特殊类型或者需要特定XML结构时非常有用。 4. **域类注解**: XStream支持使用注解来控制XML...

    xstream-src

    - **Converter** 和 **ConverterRegistry**:它们管理着 XStream 中的转换逻辑,定义了如何将对象转换成 XML 和反向转换。 4. **安全性与配置** - **安全性考量**:XStream 允许用户自定义转换器,但这也可能引入...

Global site tag (gtag.js) - Google Analytics