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

七、转换器(Converter)

我们程序中的POJO是千变万化的,而且需求也是千奇百怪的,所以XStream中的内置的转换器的功能不一定能够满足我们的要求,所以我们就需要自己构建转换器。

1,一个基本的转换器

有如下代码:

Java代码  
  1. import com.thoughtworks.xstream.XStream;  
  2. import com.thoughtworks.xstream.io.xml.DomDriver;  
  3.    
  4. public class XStreamTest4 {  
  5.    public static void main(String[] args) {  
  6.       Person person = new Person();  
  7.       person.setName("张三");  
  8.    
  9.       XStream xstream = new XStream(new DomDriver());  
  10.       xstream.alias("person", Person.class);  
  11.       System.out.println(xstream.toXML(person));  
  12.    }  
  13. }  
  14.    
  15. class Person {  
  16.    
  17.    private String name;  
  18.    
  19.    public String getName() {  
  20.       return name;  
  21.    }  
  22.    
  23.    public void setName(String name) {  
  24.       this.name = name;  
  25.    }  
  26.    
  27.    public String toString() {  
  28.       return getName();  
  29.    }  
  30. }  

运行结果是:

Java代码  
  1. <person>  
  2.   <name>张三</name>  
  3. </person>  

如果我们需要输出如下信息:

Java代码  
  1. <person>  
  2.   <fullname>张三</fullname>  
  3. </person>  

该怎么办?

当然,我们可以使用XStream默认的转换器

Java代码  
  1. xstream.aliasField("fullname", Person.class,"name");  

,甚至我们可以直接使用注解@XStreamAlias。但是这不是我们要介绍的,我们需要创建自己的转换器PersonConverter。

PersonConverter需要有3个功能:

a)告诉XStream对象,它能够转换Person类的对象(canConvert方法)

b)能够将Person对象转换为XML(marshal方法)

c)能够将XML转换成为Person对象(unmarshal方法)

现在,我们实现第一个功能(canConvert方法):

Java代码  
  1. //告诉XStream对象,它能够转换Person类的对象  
  2.    public boolean canConvert(Class clazz) {  
  3.       return clazz.equals(Person.class);  
  4.    }  

就这么简单!

然后,我们实现第二个功能(marshal方法):

Java代码  
  1. //能够将Person对象转换为XML  
  2.    public void marshal(  
  3.         Object value,            //我们将要转换的对象,这里是Person对象  
  4.         HierarchicalStreamWriter writer,//用于输出XML结果的writer  
  5.         MarshallingContext context     //序列化环境上下文  
  6.         ) {  
  7.       //写入顺序  
  8.       //1,强制转换为我们我们需要的类型  
  9.       Person person = (Person) value;  
  10.       //2,开始写入fullname节点,相当于写入<fullname>  
  11.       writer.startNode("fullname");  
  12.       //3,给fullname节点赋值  
  13.       writer.setValue(person.getName());  
  14.       //4,结束fullname节点,相当于写入</fullname>  
  15.       writer.endNode();  
  16.        
  17.        
  18. //    //如果你愿意,顺便也可以写一点其他的东西  
  19. //    writer.startNode("otherContent");  
  20. //    writer.setValue("这是一大串其他内容,你可以根据自己的需要写内容!");  
  21. //    writer.endNode();  
  22.    }  

最后,我们实现第三个功能(unmarshal方法):

Java代码  
  1. //能够将XML转换成为Person对象  
  2.    public Object unmarshal(  
  3.         HierarchicalStreamReader reader,//用于读取XML的reader  
  4.         UnmarshallingContext context   //反序列化环境上下文  
  5.         ) {  
  6.       //1,先创建一个Person对象  
  7.       Person person = new Person();  
  8.       //2,判断<person>节点下还有没有其他可以读取的节点  
  9.       while(reader.hasMoreChildren()){  
  10.         //3,开始读取下一个(也可能是第一个)节点,选择当前<person>节点的子节点作为当前节点  
  11.         reader.moveDown();  
  12.         //4,获取当前节点的值  
  13.         String value = reader.getValue();  
  14.         if("fullname".equals(reader.getNodeName())){  
  15.            person.setName(value);  
  16.         }  
  17.         //输出当前节点的内容  
  18.         System.out.println("node="+reader.getNodeName()+";value="+value);  
  19.         //5,返回上一层节点<person>  
  20.         reader.moveUp();  
  21.       }  
  22.       return person;  
  23.    }  

于是我们的PersonConverter就是:

Java代码  
  1. package cn.tjpu.zhw.xml.xstream4;  
  2.    
  3. import com.thoughtworks.xstream.converters.Converter;  
  4. import com.thoughtworks.xstream.converters.MarshallingContext;  
  5. import com.thoughtworks.xstream.converters.UnmarshallingContext;  
  6. import com.thoughtworks.xstream.io.HierarchicalStreamReader;  
  7. import com.thoughtworks.xstream.io.HierarchicalStreamWriter;  
  8.    
  9. public class PersonConverter implements Converter {  
  10.    
  11.    //告诉XStream对象,它能够转换Person类的对象  
  12.    public boolean canConvert(Class clazz) {  
  13.       return clazz.equals(Person.class);  
  14.    }  
  15.    
  16.    //能够将Person对象转换为XML  
  17.    public void marshal(  
  18.         Object value,            //我们将要转换的对象,这里是Person对象  
  19.         HierarchicalStreamWriter writer,//用于输出XML结果的writer  
  20.         MarshallingContext context     //序列化环境上下文  
  21.         ) {  
  22.       //写入顺序  
  23.       //1,强制转换为我们我们需要的类型  
  24.       Person person = (Person) value;  
  25.       //2,开始写入fullname节点,相当于写入<fullname>  
  26.       writer.startNode("fullname");  
  27.       //3,给fullname节点赋值  
  28.       writer.setValue(person.getName());  
  29.       //4,结束fullname节点,相当于写入</fullname>  
  30.       writer.endNode();  
  31.        
  32.        
  33. //    //如果你愿意,顺便也可以写一点其他的东西  
  34. //    writer.startNode("otherContent");  
  35. //    writer.setValue("这是一大串其他内容,你可以根据自己的需要写内容!");  
  36. //    writer.endNode();  
  37.    }  
  38.    
  39.    //能够将XML转换成为Person对象  
  40.    public Object unmarshal(  
  41.         HierarchicalStreamReader reader,//用于读取XML的reader  
  42.         UnmarshallingContext context   //反序列化环境上下文  
  43.         ) {  
  44.       //1,先创建一个Person对象  
  45.       Person person = new Person();  
  46.       //2,判断<person>节点下还有没有其他可以读取的节点  
  47.       while(reader.hasMoreChildren()){  
  48.         //3,开始读取下一个(也可能是第一个)节点,选择当前<person>节点的子节点作为当前节点  
  49.         reader.moveDown();  
  50.         //4,获取当前节点的值  
  51.         String value = reader.getValue();  
  52.         if("fullname".equals(reader.getNodeName())){  
  53.            person.setName(value);  
  54.         }  
  55.         //输出当前节点的内容  
  56.         System.out.println("node="+reader.getNodeName()+";value="+value);  
  57.         //5,返回上一层节点<person>  
  58.         reader.moveUp();  
  59.       }  
  60.       return person;  
  61.    }  
  62. }  

同时我们修改main方法文件:

Java代码  
  1. package cn.tjpu.zhw.xml.xstream4;  
  2.    
  3.    
  4. import com.thoughtworks.xstream.XStream;  
  5. import com.thoughtworks.xstream.io.xml.DomDriver;  
  6.    
  7. public class XStreamTest4 {  
  8.    public static void main(String[] args) {  
  9.       //创建Person对象  
  10.       Person person = new Person();  
  11.       person.setName("张三");  
  12.    
  13.       //创建XStream对象  
  14.       XStream xstream = new XStream(new DomDriver());  
  15.       xstream.alias("person", Person.class);  
  16.        
  17.       //注册PersonConverter转换器  
  18.       xstream.registerConverter(new PersonConverter());  
  19.        
  20.       //使用marshal方法,将Person对象转换成为XML  
  21.       System.out.println("****使用marshal方法,将Person对象转换成为XML==>");  
  22.       String xml = xstream.toXML(person);  
  23.       System.out.println(xml);  
  24.        
  25.       //使用unmarshal方法,将XML转换成为Person对象  
  26.       System.out.println();  
  27.       System.out.println("****使用unmarshal方法,将XML转换成为Person对象==>");  
  28.       Person p = (Person)xstream.fromXML(xml);  
  29.        
  30.       //输出Person对象  
  31.       System.out.println();  
  32.       System.out.println("****输出Person对象==>");  
  33.       System.out.println(p);  
  34.    }  
  35. }  
  36.    
  37. class Person {  
  38.    
  39.    private String name;  
  40.    
  41.    public String getName() {  
  42.       return name;  
  43.    }  
  44.    
  45.    public void setName(String name) {  
  46.       this.name = name;  
  47.    }  
  48.    
  49.    public String toString() {  
  50.       return "Person对象的name="+getName();  
  51.    }  
  52. }  

运行结果如下:

Java代码  
  1. ****使用marshal方法,将Person对象转换成为XML==>  
  2. <person>  
  3.   <fullname>张三</fullname>  
  4. </person>  
  5.    
  6. ****使用unmarshal方法,将XML转换成为Person对象==>  
  7. node=fullname;value=张三  
  8.    
  9. ****输出Person对象==>  
  10. Person对象的name=张三  

我们成功了!!!!!!

2,另一个简单的转换器

现在我们需要程序输出如下:

<person>张三</person>

该咋办?

我们再创建一个转换器:

Java代码  
  1. package cn.tjpu.zhw.xml.xstream4;  
  2.    
  3. import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;  
  4.    
  5. public class AnotherPersonConverter extends AbstractSingleValueConverter {  
  6.    
  7.    // 告诉XStream对象,它能够转换Person类的对象  
  8.    public boolean canConvert(Class clazz) {  
  9.       return clazz.equals(Person.class);  
  10.    }  
  11.    
  12.    // 将Person对象转换为XML,参数obj就是要转换的Person对象,返回值就是<person>节点的值  
  13.    public String toString(Object obj) {  
  14.       Person p = (Person) obj;  
  15.       return p.getName();  
  16.    }  
  17.    
  18.    // 将XML转换成为Person对象,参数str就是<person>节点的值,返回值就是转换得到的Person对象  
  19.    public Object fromString(String str) {  
  20.       Person person = new Person();  
  21.       person.setName(str);  
  22.       System.out.println("参数str="+str);  
  23.       return person;  
  24.    }  
  25. }  

修改Main方法:

Java代码  
  1. public class XStreamTest4 {  
  2.    public static void main(String[] args) {  
  3.       //创建Person对象  
  4.       Person person = new Person();  
  5.       person.setName("张三");  
  6.    
  7.       //创建XStream对象  
  8.       XStream xstream = new XStream(new DomDriver());  
  9.       xstream.alias("person", Person.class);  
  10.        
  11. //    //注册PersonConverter转换器  
  12. //    xstream.registerConverter(new PersonConverter());  
  13.        
  14.       //注册AnotherPersonConverter转换器  
  15.       xstream.registerConverter(new AnotherPersonConverter());  
  16.        
  17.       //使用toString方法,将Person对象转换成为XML  
  18.       System.out.println("****使用toString方法,将Person对象转换成为XML==>");  
  19.       String xml = xstream.toXML(person);  
  20.       System.out.println(xml);  
  21.        
  22.       //使用fromString方法,将XML转换成为Person对象  
  23.       System.out.println();  
  24.       System.out.println("****使用fromString方法,将XML转换成为Person对象==>");  
  25.       Person p = (Person)xstream.fromXML(xml);  
  26.        
  27.       //输出Person对象  
  28.       System.out.println();  
  29.       System.out.println("****输出Person对象==>");  
  30.       System.out.println(p);  
  31.    }  
  32. }  

运行结果:

Java代码  
  1. ****使用toString方法,将Person对象转换成为XML==>  
  2. <person>张三</person>  
  3.    
  4. ****使用fromString方法,将XML转换成为Person对象==>  
  5. 参数str=张三  
  6.    
  7. ****输出Person对象==>  
  8. Person对象的name=张三  

这正是我们预期的结果!!!

3,时间转换器

通过上面两个例子我们知道了Converter接口的简单工作方式,现在我们创建一个新的时间转换器DateConverter,这个时间转换器将以Local对象作为构造方法的参数。

这个时间转换器同样有类似PersonConverter转换器的功能:

a)告诉XStream对象,它能够转换Calendar类的对象(canConvert方法)

b)能够将Calendar对象转换为XML(marshal方法)

c)能够将XML转换成为Calendar对象(unmarshal方法)

现在实现第一个功能:

Java代码  
  1. // 告诉XStream对象,它能够转换Calendar类及其所有子类定义的对象  
  2.    public boolean canConvert(Class clazz) {  
  3.       return Calendar.class.isAssignableFrom(clazz);  
  4.    }  

然后,实现第二个功能:

Java代码  
  1. // 能够将Calendar对象转换为XML  
  2.    public void marshal(Object value, HierarchicalStreamWriter writer,  
  3.         MarshallingContext context) {  
  4.       //value是将要转换的Calendar对象  
  5.       Calendar calendar = (Calendar) value;  
  6.       Date date = calendar.getTime();  
  7.        
  8.       //设定格式化格式  
  9.       DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,  
  10.            this.locale);  
  11.        
  12.       //格式化并输出Calendar对象  
  13.       writer.setValue(formatter.format(date));  
  14.    }  

最后,实现最后一个功能:

Java代码  
  1. // 能够将XML转换成为Calendar对象  
  2.    public Object unmarshal(HierarchicalStreamReader reader,  
  3.         UnmarshallingContext context) {  
  4.       //创建一个Calendar对象  
  5.       GregorianCalendar calendar = new GregorianCalendar();  
  6.        
  7.       //设定解析格式  
  8.       DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,  
  9.            this.locale);  
  10.       try {  
  11.         //解析指定格式的Calendar对象  
  12.         calendar.setTime(formatter.parse(reader.getValue()));  
  13.       } catch (ParseException e) {  
  14.         throw new ConversionException(e.getMessage(), e);  
  15.       }  
  16.       //返回解析成功的Calendar对象  
  17.       return calendar;  
  18.    }  

于是,我们的DateConverter定义如下:

Java代码  
  1. package cn.tjpu.zhw.xml.xstream4;  
  2.    
  3. import java.text.DateFormat;  
  4. import java.text.ParseException;  
  5. import java.util.Calendar;  
  6. import java.util.Date;  
  7. import java.util.GregorianCalendar;  
  8. import java.util.Locale;  
  9.    
  10. import com.thoughtworks.xstream.converters.ConversionException;  
  11. import com.thoughtworks.xstream.converters.Converter;  
  12. import com.thoughtworks.xstream.converters.MarshallingContext;  
  13. import com.thoughtworks.xstream.converters.UnmarshallingContext;  
  14. import com.thoughtworks.xstream.io.HierarchicalStreamReader;  
  15. import com.thoughtworks.xstream.io.HierarchicalStreamWriter;  
  16.    
  17. public class DateConverter implements Converter {  
  18.    
  19.    private Locale locale;  
  20.    
  21.    public DateConverter(Locale locale) {  
  22.       super();  
  23.       this.locale = locale;  
  24.    }  
  25.    
  26.    // 告诉XStream对象,它能够转换Calendar类及其所有子类定义的对象  
  27.    public boolean canConvert(Class clazz) {  
  28.       return Calendar.class.isAssignableFrom(clazz);  
  29.    }  
  30.    
  31.    // 能够将Calendar对象转换为XML  
  32.    public void marshal(Object value, HierarchicalStreamWriter writer,  
  33.         MarshallingContext context) {  
  34.       //value是将要转换的Calendar对象  
  35.       Calendar calendar = (Calendar) value;  
  36.       Date date = calendar.getTime();  
  37.        
  38.       //设定格式化格式  
  39.       DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,  
  40.            this.locale);  
  41.        
  42.       //格式化并输出Calendar对象  
  43.       writer.setValue(formatter.format(date));  
  44.    }  
  45.    
  46.    // 能够将XML转换成为Calendar对象  
  47.    public Object unmarshal(HierarchicalStreamReader reader,  
  48.         UnmarshallingContext context) {  
  49.       //创建一个Calendar对象  
  50.       GregorianCalendar calendar = new GregorianCalendar();  
  51.        
  52.       //设定解析格式  
  53.       DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,  
  54.            this.locale);  
  55.       try {  
  56.         //解析指定格式的Calendar对象  
  57.         calendar.setTime(formatter.parse(reader.getValue()));  
  58.       } catch (ParseException e) {  
  59.         throw new ConversionException(e.getMessage(), e);  
  60.       }  
  61.       //返回解析成功的Calendar对象  
  62.       return calendar;  
  63.    }  
  64. }  

再写我们的main方法:

Java代码  
  1. package cn.tjpu.zhw.xml.xstream4;  
  2.    
  3. import java.text.DateFormat;  
  4. import java.util.Calendar;  
  5. import java.util.GregorianCalendar;  
  6. import java.util.Locale;  
  7.    
  8. import com.thoughtworks.xstream.XStream;  
  9. import com.thoughtworks.xstream.io.xml.DomDriver;  
  10.    
  11. public class DateMain {  
  12.    
  13.    public static void main(String[] args) {  
  14.       // 获取当前时间  
  15.       Calendar calendar = new GregorianCalendar();  
  16.    
  17.       // 创建XStream对象  
  18.       XStream xstream = new XStream(new DomDriver());  
  19.       xstream.alias("date", Calendar.class);  
  20.    
  21.       // 注册我们定义的时间转换器  
  22.       xstream.registerConverter(new DateConverter(new Locale("zh", "cn")));  
  23.    
  24.       // 转换并输出XML  
  25.       String xml = xstream.toXML(calendar);  
  26.       System.out.println(xstream.toXML(calendar));  
  27.    
  28.       // 加载XML中的时间数据  
  29.       Calendar loaded = (Calendar) xstream.fromXML(xml);  
  30.       //格式化并输出时间  
  31.       System.out.println(DateFormat.getDateInstance(DateFormat.MEDIUM).format(  
  32.            loaded.getTime()));  
  33.    }  
  34. }  

运行,结果如下:

Java代码  
  1. <date>2013年12月24日 星期二</date>  
  2. 2013-12-24  

4,更加复杂的转换器

复杂的转换器都是由一系列基本的转换器组成的,我们只需要将这些基本的转换器按照适当的顺序排列组合就行了。

下面有一个复杂的Birthday类:

Java代码  
  1. package cn.tjpu.zhw.xml.xstream4;  
  2.    
  3. import java.util.Calendar;  
  4.    
  5.    
  6. public class Birthday {  
  7.    
  8.    private Person person;  
  9.    private Calendar date;  
  10.    private char gender;  
  11.    
  12.    public Person getPerson() {  
  13.       return person;  
  14.    }  
  15.    
  16.    public void setPerson(Person person) {  
  17.       this.person = person;  
  18.    }  
  19.    
  20.    public Calendar getDate() {  
  21.       return date;  
  22.    }  
  23.    
  24.    public void setDate(Calendar date) {  
  25.       this.date = date;  
  26.    }  
  27.    
  28.    public char getGender() {  
  29.       return gender;  
  30.    }  
  31.    
  32.    public void setGenderMale() {  
  33.       this.gender = 'm';  
  34.    }  
  35.    
  36.    public void setGenderFemale() {  
  37.       this.gender = 'f';  
  38.    }  
  39.     
  40.    public String toString(){  
  41.       return "{person="+person+"};{date="+date.getTime()+"};{gender="+gender+"}";  
  42.    }  
  43.    
  44. }  

我们将怎样转换这个类呢?

答案是,我们只需要将现有的转换器组合成一个BirthdayConverter转换器就成了!

Java代码  
  1. package cn.tjpu.zhw.xml.xstream4;  
  2.    
  3. import java.util.Calendar;  
  4.    
  5. import com.thoughtworks.xstream.converters.ConversionException;  
  6. import com.thoughtworks.xstream.converters.Converter;  
  7. import com.thoughtworks.xstream.converters.MarshallingContext;  
  8. import com.thoughtworks.xstream.converters.UnmarshallingContext;  
  9. import com.thoughtworks.xstream.io.HierarchicalStreamReader;  
  10. import com.thoughtworks.xstream.io.HierarchicalStreamWriter;  
  11.    
  12. public class BirthdayConverter implements Converter {  
  13.    
  14.    // 告诉XStream对象,它能够转换Birthday类的对象  
  15.    public boolean canConvert(Class clazz) {  
  16.       return Birthday.class == clazz;  
  17.    }  
  18.    
  19.    // 能够将Birthday对象转换为XML  
  20.    public void marshal(Object value, HierarchicalStreamWriter writer,  
  21.         MarshallingContext context) {  
  22.       //value是将要被转换的Birthday对象  
  23.       Birthday birthday = (Birthday) value;  
  24.        
  25.       //给<birthday>节点添加gender属性  
  26.       if (birthday.getGender() != '') {  
  27.         writer.addAttribute("gender",  
  28.               Character.toString(birthday.getGender()));  
  29.       }  
  30.        
  31.       //给<birthday>节点添加子节点<person>  
  32.       if (birthday.getPerson() != null) {  
  33.         writer.startNode("person");  
  34.         context.convertAnother(birthday.getPerson());  
  35.         writer.endNode();  
  36.       }  
  37.        
  38.       //给<birthday>节点添加子节点<birth>  
  39.       if (birthday.getDate() != null) {  
  40.         writer.startNode("birth");  
  41.         context.convertAnother(birthday.getDate());  
  42.         writer.endNode();  
  43.       }  
  44.    }  
  45.    
  46.    // 能够将XML转换成为Birthday对象  
  47.    public Object unmarshal(HierarchicalStreamReader reader,  
  48.         UnmarshallingContext context) {  
  49.       //创建Birthday对象  
  50.       Birthday birthday = new Birthday();  
  51.        
  52.       //当前节点是<birthday>  
  53.       //解析<birthday>节点的gender属性  
  54.       String gender = reader.getAttribute("gender");  
  55.       if (gender != null) {  
  56.         if (gender.length() > 0) {  
  57.            if (gender.charAt(0) == 'f') {  
  58.               birthday.setGenderFemale();  
  59.            } else if (gender.charAt(0) == 'm') {  
  60.               birthday.setGenderMale();  
  61.            } else {  
  62.               throw new ConversionException("Invalid gender value: "  
  63.                     + gender);  
  64.            }  
  65.         } else {  
  66.            throw new ConversionException(  
  67.                  "Empty string is invalid gender value");  
  68.         }  
  69.       }  
  70.        
  71.       //遍历解析<birthday>节点的所有子节点  
  72.       while (reader.hasMoreChildren()) {  
  73.         //将下一个(也可能是第一个)子节点作为当前节点  
  74.         reader.moveDown();  
  75.          
  76.         //解析<person>节点  
  77.         if ("person".equals(reader.getNodeName())) {  
  78.            Person person = (Person) context.convertAnother(birthday,  
  79.                  Person.class);  
  80.            birthday.setPerson(person);  
  81.         }  
  82.         //解析<birth>节点  
  83.         else if ("birth".equals(reader.getNodeName())) {  
  84.            Calendar date = (Calendar) context.convertAnother(birthday,  
  85.                  Calendar.class);  
  86.            birthday.setDate(date);  
  87.         }  
  88.         //返回到<birthday>节点作为当前节点  
  89.         reader.moveUp();  
  90.       }  
  91.        
  92.       //返回解析得到的Birthday对象  
  93.       return birthday;  
  94.    }  
  95.    
  96. }  

下面写main方法:

Java代码  
  1. package cn.tjpu.zhw.xml.xstream4;  
  2.    
  3. import java.util.GregorianCalendar;  
  4.    
  5. import com.thoughtworks.xstream.XStream;  
  6.    
  7. public class BirthdayMain {  
  8.    
  9.    public static void main(String[] args) {  
  10.    
  11.       //创建Birthday对象  
  12.       Birthday birthday = new Birthday();  
  13.       Person p = new Person();  
  14.       p.setName("张三");  
  15.       birthday.setPerson(p);  
  16.       birthday.setDate(new GregorianCalendar());  
  17.       birthday.setGenderMale();  
  18.        
  19.       //创建XStream对象  
  20.       XStream xstream = new XStream();  
  21.       xstream.alias("birthday", Birthday.class);  
  22.        
  23.       //注册BirthdayConverter转换器  
  24.       xstream.registerConverter(new BirthdayConverter());  
  25.        
  26.       //将Birthday对象转换成为XML并输出  
  27.       String xml = xstream.toXML(birthday);  
  28.       System.out.println("**************将Birthday对象转换成为XML并输出**************");  
  29.       System.out.println(xml);  
  30.        
  31.       //将XML转换成为Birthday对象  
  32.       Birthday b = (Birthday)xstream.fromXML(xml);  
  33.       //输出Birthday对象  
  34.       System.out.println();  
  35.       System.out.println("**************将XML转换成为Birthday对象**************");  
  36.       System.out.println(b);  
  37.        
  38.    }  
  39.    
  40. }  

运行结果:

Java代码  
  1. **************将Birthday对象转换成为XML并输出**************  
  2. <birthday gender="m">  
  3.   <person>  
  4.     <name>张三</name>  
  5.   </person>  
  6.   <birth>  
  7.     <time>1387897906531</time>  
  8.     <timezone>Asia/Shanghai</timezone>  
  9.   </birth>  
  10. </birthday>  
  11.    
  12. **************将XML转换成为Birthday对象**************  
  13. {person=Person对象的name=张三};{date=Tue Dec 24 23:11:46 CST 2013};{gender=m}  
原文地址:https://www.cnblogs.com/eer123/p/7894910.html