`

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  
很牛逼   非常感谢

相关推荐

    最齐全的xstream1.4.8.jar

    最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar ...

    xstream-1.4.15.jar

    XStream 反序列化漏洞(CVE-2020-26258 & 26259),修复jar包 xstream-1.4.15.jar Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象。XStream 是一款开源软件,允许在 BSD 许可证的许可下分发...

    XStream的Date转换 @XStreamConverter DateConverter

    NULL 博文链接:https://liuxihope.iteye.com/blog/2228714

    xstream最新版 - xstream-1.4.18.jar

    xstream最新版jar包

    XStream XML与Json转换

    XStream在运行时使用Java反射机制对要进行序列化的对象树的结构进行探索,并不需要对对象作出修改。XStream可以序列化内部字段,包括私private和final字段,并且支持非公开类...同时,也支持用户自定义的类型转换器。

    xstream-1.4.11-API文档-中文版.zip

    赠送jar包:xstream-1.4.11.jar; 赠送原API文档:xstream-1.4.11-javadoc.jar; 赠送源代码:xstream-1.4.11-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.11.pom; 包含翻译后的API文档:xstream-1.4.11-...

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

    NULL 博文链接:https://zhenghuazhi.iteye.com/blog/1750370

    xstream-1.4.19.jar

    xstream-1.4.19.jar

    解决XStream注解同名冲突

    converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter path : /.../... line number : 1 version : 1.4.7 ------------------------------- 该包解决了这个bug

    xstream-1.4.jar

    xstream jar包,java对象转xml以及xml转java对象,操作很简单。

    xstream-1.4.2.jar

    xstream-1.4.2.jar,官网上也有,由于本人分没了,希望有分的同志给点分。如果你也每份,请上官网下,地址:http://xstream.codehaus.org/download.html

    xstream-1.4.7.jar

    xstream-1.4.7.jar XML

    xstream1.22.jar

    xstream 1.2 ,xstream 1.2.2.jar xstream 1.2 ,xstream 1.2.2.jar

    xstream-1.4.7-API文档-中文版.zip

    赠送jar包:xstream-1.4.7.jar; 赠送原API文档:xstream-1.4.7-javadoc.jar; 赠送源代码:xstream-1.4.7-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.7.pom; 包含翻译后的API文档:xstream-1.4.7-javadoc-...

    xstream相关的jar包

    xstream所需要的jar包,xstream-1.4.9.jar、dom4j-1.6.1.jar、xpp3_min-1.1.4c.jar等

    Java用xStream拼接xml

    webService接口对接时,需要传递一个xml内容。用xStream拼接xml

    powermock-classloading-xstream-1.4.7

    powermock-classloading-xstream-1.4.7powermock-classloading-xstream-1.4.7powermock-classloading-xstream-1.4.7powermock-classloading-xstream-1.4.7powermock-classloading-xstream-1.4.7powermock-class...

    XStream解析XML实例

    XStream解析XML实例

    xstream-1.3.1-sae-liufeng

    修改XStream源码,解决SAE不支持XStream的问题。

    xstream-1.4.2

    xstream-1.4.2

Global site tag (gtag.js) - Google Analytics