`

Xstream 自定义converter

    博客分类:
  • XML
XML 
阅读更多

1、创建一个Person转换器:
下面我们来创建一个简单的转换器,它能:
a,用来转换Person类
b,将Person实例转换成XML
c,将xml转换为Person实例
(1)首先创建一个PersonConverter类,并让这个类实现Converter接口:

package com.thoughtworks.xstream.examples; 
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; 
public class PersonConverter implements Converter { 
        public boolean canConvert(Class clazz) { 
                return false; 
        } 
        public void marshal(Object value, HierarchicalStreamWriter writer, 
                        MarshallingContext context) { 
        } 
        public Object unmarshal(HierarchicalStreamReader reader, 
                        UnmarshallingContext context) { 
                return null; 
        } 
}

 

(2) 下面,我们首先告诉转换器,我们只能转换Person类,而不是别的类,包括其子类:(这一步很简单,除非你是用来处理泛型的转换器是会困难一点。

public boolean canConvert(Class clazz) { 
        return clazz.equals(Person.class); 
}

 (3)编辑转换器

 

 

 

 

 

package com.thoughtworks.xstream.examples; 
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; 
public class PersonConverter implements Converter { 
 
        public boolean canConvert(Class clazz) { 
                return clazz.equals(Person.class); 
        } 
	    /**
		**Marshal方法是用来将对象转换为XML的,他有三个参数:
			1,我们准备转换的对象
			2,我们准备输出对象的writer
			3,当前的marshaling context
		*/
        public void marshal(Object value, HierarchicalStreamWriter writer, 
                        MarshallingContext context) { 

                Person person = (Person) value; 
				//创建一个叫做fullname的节点,并将person的名字传给他
				//可以任意次数的调用start/end node方法,但需要记住,你必须在打开一个节点之后记住关闭它。
				//一般来说,执行转换的操作在setValue方法调用时发生
                writer.startNode("fullname"); 
                writer.setValue(person.getName()); 				
                writer.endNode(); 
        } 
 
        public Object unmarshal(HierarchicalStreamReader reader, 
                        UnmarshallingContext context) { 
                Person person = new Person(); 
				//使用moveDown和moveUp方法在节点树层次中移动,所以,这里我们只需要简单的moveDown,得到值,再moveUp
                reader.moveDown(); 
                person.setName(reader.getValue()); 
                reader.moveUp(); 
                return person; 
        } 
}

 (4)注册转换器

XStream xStream = new XStream(new DomDriver()); 
                xStream.registerConverter(new PersonConverter()); 

 

 

 

 

 

 

2、Date转换器示例:

 

package com.thoughtworks.xstream.examples; 
 
import java.text.DateFormat; 
import java.text.ParseException; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import java.util.Locale; 
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; 
public class DateConverter implements Converter { 
        private Locale locale; 
        public DateConverter(Locale locale) { 
                super(); 
                this.locale = locale; 
        } 
        public boolean canConvert(Class clazz) { 
                return Calendar.class.isAssignableFrom(clazz); 
        } 
        public void marshal(Object value, HierarchicalStreamWriter writer, 
                        MarshallingContext context) { 
                Calendar calendar = (Calendar) value; 
                Date date = calendar.getTime(); 
                DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, 
                                this.locale); 
                writer.setValue(formatter.format(date)); 
        } 
        public Object unmarshal(HierarchicalStreamReader reader, 
                        UnmarshallingContext context) { 
                GregorianCalendar calendar = new GregorianCalendar(); 
				//时间本地化
                DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, 
                                this.locale); 
                try { 
                        calendar.setTime(formatter.parse(reader.getValue())); 
                } catch (ParseException e) { 
                        throw new ConversionException(e.getMessage(), e); 
                } 
                return calendar; 
        } 
}


// grabs the current date from the virtual machine 
Calendar calendar = new GregorianCalendar(); 
// creates the xstream 
XStream xStream = new XStream(new DomDriver()); 
// brazilian portuguese locale 
xStream.registerConverter(new DateConverter(new Locale("pt", "br"))); 
// prints the result 
System.out.println(xStream.toXML(calendar)); 

 

分享到:
评论
2 楼 zhjxzhj 2012-01-09  
正需要这个  非常感谢
1 楼 zhjxzhj 2012-01-09  
很牛逼   非常感谢

相关推荐

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

    《XStream的高级用法与自定义输出结构详解》 XStream是一款强大的Java库,用于将Java对象序列化为XML,以及将XML反序列化回Java对象。它以其简洁的API和灵活的配置赢得了广大开发者喜爱。在日常开发中,我们不仅...

    XStream的Date转换 @XStreamConverter DateConverter

    标题提到的“XStream的Date转换 @XStreamConverter DateConverter”主要涉及两个核心概念:XStream的转换器(Converter)和`@XStreamConverter`注解。转换器是XStream的核心机制之一,它负责将Java对象转化为XML元素...

    XStream及依赖包

    4. **自定义转换器**:对于复杂的数据类型或者自定义对象,可以通过实现XStream的Converter接口来自定义XML到Java对象的转换逻辑。 5. **XML格式**:XStream允许用户自定义XML的输出格式,如缩进、命名空间等。 6. *...

    xstream教程资料.rar

    通过实现`com.thoughtworks.xstream.converters.Converter`接口并注册到XStream实例中,可以控制对象到XML的转换过程。 五、安全与配置 由于XStream可以直接将任何Java对象序列化,可能存在安全风险。为了防止恶意...

    使用XStream操作xml教程

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

    xstream解析依赖包

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

    XStream简单应用实例

    通过实现`com.thoughtworks.xstream.converters.Converter`接口并注册到XStream实例中,你可以控制XML的生成和解析过程。 **安全模式** 为了防止XSS攻击,XStream提供了安全模式,可以限制哪些类可以被序列化或反...

    xstream-1.4.2

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

    XStream转换

    你可以通过实现`com.thoughtworks.xstream.converters.Converter`接口来创建自定义转换器,并注册到XStream实例中。 总的来说,XStream是一个强大且灵活的工具,用于在Java对象和XML之间进行数据交换。它简化了序列...

    xstream-1.4.8最齐全的jar包

    3. **自定义转换器**:对于复杂的对象结构或者特殊类型的转换,可以通过实现`Converter`接口来自定义转换逻辑。 4. **域级注解**:XStream提供了`@XStreamAlias`、`@XStreamAsAttribute`等注解,允许开发者在类或...

    xstream-1.4-API

    对于 XStream 不支持的复杂类型,可以通过实现 `Converter` 接口或继承 `AbstractSingleValueConverter` 来自定义转换逻辑。 ```java xstream.registerConverter(new MyCustomConverter()); ``` ### 6. **安全性与...

    xstream-distribution-1.4.15-bin.zip

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

    XStream使用例子

    **XStream库详解** ...通过理解和掌握其核心特性、安全性设置以及自定义转换器,开发者可以在项目中充分利用XStream的优势,提高代码的可读性和可维护性。同时,了解如何优化性能也是确保系统高效运行的关键。

    xStream用法总结

    为了处理这种情况,我们需要创建相应的 Java 类(`Param`, `Name`, `Value`)以及两个转换器(`NameConverter`, `ValueConverter`),这些转换器需要实现 `com.thoughtworks.xstream.converters.Converter` 接口。...

    Xstream register 转换器

    "Xstream register 转换器"这个主题主要涉及到如何自定义转换器来处理特定类型的对象,以便更好地控制XML的输出格式或者解决某些复杂类型的序列化问题。在这篇博客文章中(虽然链接未提供具体内容),作者可能详细...

    xStream转换xml和json源码

    xStream允许你自定义对象的序列化和反序列化过程。通过实现`Converter`接口,你可以控制对象如何被转换为XML或JSON,以及如何从这些格式恢复。 ```java public class CustomPersonConverter implements Converter {...

    XStream4JavaDemo演示源码

    通过这个示例,我们可以了解到XStream如何简化Java对象与XML之间的转换,以及如何自定义转换规则以满足特定需求。无论是进行数据持久化,还是进行网络数据交换,XStream都是一个非常实用的工具。在深入研究源码时,...

    XStream解析字符串不同的标签

    XStream 的核心概念是通过自定义的“转换器(Converter)”来处理特定类型的 Java 类。转换器负责将对象转换成 XML 格式,以及将 XML 解析回对应的 Java 对象。XStream 提供了丰富的内置转换器来处理标准的 Java ...

    XStream XML解析

    你可以创建一个实现了 `com.thoughtworks.xstream.converters.Converter` 接口的类,并注册到 XStream 实例中。 2. **域类别名** 通过设置类别的别名,可以使 XML 输出更简洁易读: ```java xstream.alias(...

Global site tag (gtag.js) - Google Analytics