1.如果Date类型是元素,可参考http://huyumin.iteye.com/blog/2072675实现;
-
public class bookinfo implements java.io.Serializable
-
{
-
private Long id;
-
-
//Fields
-
private java.lang.Long bsno;
-
private java.lang.String bookname;
-
private java.lang.String isbn;
-
private java.lang.String booktype;
-
private java.lang.String author;
-
private java.util.Date publishdate;
-
private java.lang.Long quantityperpackage;
-
private java.lang.Long height;
-
-
}
在bookinfo中的publishdate是一个date对象,在用XStream做转换的时,由于XStream自带的DateConverter 不能转换形如“2010-10-07”这样的日期格式,只能自定义一个转换器
-
public class DateConverter implements Converter {
-
-
@Override
-
public boolean canConvert(Class arg0) {
-
-
return Date.class == arg0;
-
}
-
@Override
-
public void marshal(Object arg0, HierarchicalStreamWriter arg1,
-
MarshallingContext arg2) {
-
-
-
}
-
@Override
-
public Object unmarshal(HierarchicalStreamReader reader,
-
UnmarshallingContext arg1) {
-
GregorianCalendar calendar = new GregorianCalendar();
-
SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd"); //格式化当前系统日期
-
try {
-
calendar.setTime(dateFm.parse(reader.getValue()));
-
} catch (ParseException e) {
-
throw new ConversionException(e.getMessage(), e);
-
}
-
return calendar.getTime();
-
-
}
-
-
}
最后在程序中注册构造的转换器。。。。
-
XStream xstream = new XStream(new DomDriver());
-
xstream.registerConverter(new DateConverter());
同样的,在从XML向java对象转换时,如果Long对应的是空字符串,Xstream也会报错,例如,XML文件中如果quantityperpackage的值为空,则转换为Long时会报错,则,同样的编写转换器,在转换器中判断,如果XML中对应的为空,则让Long等于null。
对象的转换器如下:
-
public class LongConverter implements Converter {
-
-
@Override
-
public boolean canConvert(Class arg0) {
-
-
return Long.class == arg0;
-
}
-
@Override
-
public void marshal(Object arg0, HierarchicalStreamWriter arg1,
-
MarshallingContext arg2) {
-
-
-
}
-
@Override
-
public Object unmarshal(HierarchicalStreamReader reader,
-
UnmarshallingContext arg1) {
-
Long longnum = new Long("1");
-
System.out.println(reader.getValue());
-
if("".equals(reader.getValue()))
-
{
-
System.out.println("long is null");
-
longnum = null;
-
return longnum;
-
}
-
else{
-
longnum = longnum.valueOf(reader.getValue());
-
System.out.println("long is not null");
-
return longnum;
-
}
-
-
-
}
-
-
}
同样在程序中注册构造的转换器。。。。
-
XStream xstream = new XStream(new DomDriver());
-
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);