最近使用Xstream来实现java对象转xml文件,然后由于要处理键值对,就重新写了转换器。对canConvert(),marshal(),unmarshal()三个方法重写,这三个方法作用分别是:
canConvert():用来判断需要序列化的对象是否使用此转换器,用户可以在此方法自定义使用的类,或者可以直接返回true来表名此转换器为通用。xstream会自动执行此方法,如果canConvert()的返回结果为false,转换器将不起作用。
marshal():序列化,对于java对象转换成xml文件的自定义序列化操作将会执行此方法。方法含有三个参数,分别是:需要转换的对象、序列化输出对象和序列化上下文对象。
unmarshal():反序列化,对于xml文件转换成java对象是需要执行的方法。方法含有两个参数,分别是:反序列化读取对象和反序列化上下文对象。
(此处,借鉴于[https://blog.csdn.net/qb170217/article/details/81867679])
在重写marshal()方法时,出现null值问题处理。在实例类中的字段根据注解@XStreamConverter来区分是否需要走转换器。未走转换器字段如果出现空值在xml中以如下格式生成:
<GenderCode></GenderCode>
但是走转换器后的非空值,我生成如下格式:
<GenderCode version="1.0" value="2">女</GenderCode>
实现代码是
writer.addAttribute("version", "1.0");
writer.addAttribute("value", value);
writer.setValue(Name);
但是空值走转换器得到的xml格式是
</GenderCode>
以下是我解决该问题方法,因为存在空值,我做非空判断,只在有值的情况下走了setValue(),只需要把这句话移出来,在空值情况同样set一个空就行,以下为原代码:
if (!"".equals(name)) {
writer.addAttribute("version", "1.0");
writer.addAttribute("value", value);
}
writer.setValue(name);
问题个例仅供参考,谢谢!