java – XStream序列化空值

前端之家收集整理的这篇文章主要介绍了java – XStream序列化空值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有
class Student
{
String name;
int    age;
String teacher;
}

然后 :

public class App1
{
    public static void main(String[] args)
    {
        Student st = new Student();
        st.setName("toto");

        XStream xs = new XStream();

        xs.alias("student",Student.class);

        System.out.println(xs.toXML(st));
    }

}

给我 :

<student>
  <name>toto</name>
  <age>0</age>
</student>

有没有办法处理空值?我的意思是 :

<student>
  <name>toto</name>
  <age>0</age>
  <teacher></teacher>
</student>

如果我这样做可能

st.setTeacher("");

但如果老师是空的,那就没有.

我尝试使用自定义转换器,但似乎空值不会发送到转换器.

解决方法

我正在使用XStream 1.4.7,@ XStreamAlias注释用于自定义字段名称,@ XStreamConverter用于自定义转换器(用于表示日期和其他自定义bean).但是,甚至没有调用空值的自定义转换器.
我的目标是序列化对象的所有字段,包括null字段,我不需要解组XML.

我设法通过创建自定义ReflectionConverter来做到这一点.
我从XStream库扩展了ReflectionConverter并覆盖了doMarshal方法.我唯一改变的是为null info.values调用writeField方法

new Object() {
{
    for (Iterator fieldIter = fields.iterator(); fieldIter.hasNext();) {
        FieldInfo info = (FieldInfo) fieldIter.next();
        if (info.value != null) {
            //leave the code unchanged
            ...
        } else {
            //add this to write null info.value to xml
            Log.info("MyCustomReflectionConverter -> serialize null field: " + info.fieldName);
            writeField(info.fieldName,null,info.type,info.definedIn,info.value);
        }
    }
    //... leave the rest of the code unchanged
}
};

之后,我创建了类似的xStream实例(以非常低的优先级注册转换器非常重要):

StaxDriver driver = new StaxDriver(new NoNameCoder()) {
    @Override
    public StaxWriter createStaxWriter(XMLStreamWriter out) throws XMLStreamException {
        // the boolean parameter controls the production of XML declaration
        return createStaxWriter(out,false);
    }
};

XStream xStream = new XStream(driver);
xStream.autodetectAnnotations(true);//needed to process aliases
//register MyCustomReflectionConverter
MyCustomReflectionConverter reflectionConverter = new MyCustomReflectionConverter (xStream.getMapper(),new SunUnsafeReflectionProvider());
xStream.registerConverter(reflectionConverter,XStream.PRIORITY_VERY_LOW);

感谢Mark Nabours的解决方here

希望能帮助到你.有人找到了更好的解决方案吗?

猜你在找的Java相关文章