XStream的日期转换XStreamDateConverter

来源:互联网 发布:白马非马 知乎 编辑:程序博客网 时间:2024/05/10 04:07

1.如果Date类型是元素,可参考http://huyumin.iteye.com/blog/2072675实现;

类如下:  
  1. publicclass bookinfoimplements java.io.Serializable  

  2. {  

  3.  private Long id;  

  4.    

  5.     //Fields  

  6.     private java.lang.Long bsno;  

  7.     private java.lang.String bookname;  

  8.     private java.lang.String isbn;  

  9.     private java.lang.String booktype;  

  10.     private java.lang.String author;  

  11.     private java.util.Date publishdate;  

  12.     private java.lang.Long quantityperpackage;  

  13.     private java.lang.Long height;  

  14.  

  15. }  


在bookinfo中的publishdate是一个date对象,在用XStream做转换的时,由于XStream自带的DateConverter  不能转换形如“2010-10-07”这样的日期格式,只能自定义一个转换器  
  1. publicclass DateConverter  implements Converter {  

  2.  

  3. @Override  

  4. publicboolean canConvert(Class arg0) {  

  5.  

  6.  return Date.class == arg0;  

  7. }  

  8. @Override  

  9. publicvoid marshal(Object arg0, HierarchicalStreamWriter arg1,  

  10.   MarshallingContext arg2) {  

  11.  

  12.    

  13. }  

  14. @Override  

  15. public Object unmarshal(HierarchicalStreamReader reader,  

  16.   UnmarshallingContext arg1) {  

  17.        GregorianCalendar calendar = new GregorianCalendar();  

  18.        SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd");//格式化当前系统日期  

  19.        try {  

  20.                calendar.setTime(dateFm.parse(reader.getValue()));  

  21.        } catch (ParseException e) {  

  22.                thrownew ConversionException(e.getMessage(), e);  

  23.        }  

  24.        return calendar.getTime();  

  25.  

  26. }  

  27.  

  28. }  



最后在程序中注册构造的转换器。。。。  
  1. XStream xstream = new XStream(new DomDriver());  

  2. xstream.registerConverter(new DateConverter());  


同样的,在从XML向java对象转换时,如果Long对应的是空字符串,Xstream也会报错,例如,XML文件中如果quantityperpackage的值为空,则转换为Long时会报错,则,同样的编写转换器,在转换器中判断,如果XML中对应的为空,则让Long等于null。  

对象的转换器如下:  
  1. publicclass LongConverter  implements Converter {  

  2.  

  3. @Override  

  4. publicboolean canConvert(Class arg0) {  

  5.  

  6.  return Long.class == arg0;  

  7. }  

  8. @Override  

  9. publicvoid marshal(Object arg0, HierarchicalStreamWriter arg1,  

  10.   MarshallingContext arg2) {  

  11.  

  12.    

  13. }  

  14. @Override  

  15. public Object unmarshal(HierarchicalStreamReader reader,  

  16.   UnmarshallingContext arg1) {  

  17.  Long longnum = new Long("1");  

  18.  System.out.println(reader.getValue());  

  19.        if("".equals(reader.getValue()))  

  20.        {  

  21.         System.out.println("long is null");  

  22.         longnum = null;  

  23.         return longnum;  

  24.        }  

  25.        else{  

  26.         longnum = longnum.valueOf(reader.getValue());  

  27.         System.out.println("long is not null");  

  28.            return longnum;  

  29.        }  

  30.        

  31.  

  32. }  

  33.  

  34. }  



同样在程序中注册构造的转换器。。。。  
  1. XStream xstream = new XStream(new DomDriver());  

  2. xstream.registerConverter(new LongConverter());  




2.如果Date类型是属性,则要构造实现SingleValueConverter的转换类,方法如下:

public class XStreamDateConverter  implements SingleValueConverter {@Overridepublic boolean canConvert(Class arg0) {return Date.class == arg0;}@Overridepublic Object fromString(String arg0) {try {return DateUtil.parse(arg0, "yyyy-MM-dd");} catch (ParseException e) {e.printStackTrace();}return null;}@Overridepublic String toString(Object arg0) {return DateUtil.getDateStrByPattern((Date) arg0, "yyyy-MM-dd");} }



在需要转换的Date属性上添加注解如下:

@XStreamConverter(value=XStreamDateConverter.class)@XStreamAsAttributeprivate Date startTime;@XStreamConverter(value=XStreamDateConverter.class)@XStreamAsAttributeprivate Date endTime;



最后注册这个Converter就可以了

String xml = "";XStream f = new XStream(new DomDriver()); f.registerConverter(new XStreamDateConverter());  f.autodetectAnnotations(true);

f.fromXML(xml);

0 0
原创粉丝点击