XStream的日期转换XStreamDateConverter

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

类如下:  
  1. public class bookinfo implements 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. public class DateConverter  implements Converter {  

  2.  

  3. @Override  

  4. public boolean canConvert(Class arg0) {  

  5.  

  6.  return Date.class == arg0;  

  7. }  

  8. @Override  

  9. public void 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.                throw new 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. public class LongConverter  implements Converter {  

  2.  

  3. @Override  

  4. public boolean canConvert(Class arg0) {  

  5.  

  6.  return Long.class == arg0;  

  7. }  

  8. @Override  

  9. public void 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 {

	@Override
	public boolean canConvert(Class arg0) {
		return Date.class == arg0;
	}

	@Override
	public Object fromString(String arg0) {
		try {
			return DateUtil.parse(arg0, "yyyy-MM-dd");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public String toString(Object arg0) {
		return DateUtil.getDateStrByPattern((Date) arg0, "yyyy-MM-dd");
	}

 }



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

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



最后注册这个Converter就可以了

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

f.fromXML(xml);

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值