如何在XStream中使用自定义转换器转换对象

时间:2019-05-16 19:43:38

标签: java xml serialization xstream

我有一个这样的班级:

class Foo {
    public ObjectProperty<Object> valueProperty;

    Foo() {
        valueProperty = new SimpleObjectProperty<>();
    }
}

我想使用XStream将Foo类型的对象转换为XML,但是我需要使用自定义转换器,因为Foo包含一个JavaFX property,该序列不能轻易序列化。 但是具体细节并不重要,您只需要知道属性的getValue可以返回null。

我目前的做法是:

public class FooConverter implements Converter {

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        Foo foo = (Foo) source;
        if(foo.valueProperty.getValue() != null) {
            writer.startNode("value");
            context.convertAnother(foo.valueProperty.getValue());
            writer.endNode();
        }
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        Foo foo = new Foo();

        reader.moveDown();
        if(reader.hasMoreChildren()) {
            foo.valueProperty.setValue(context.convertAnother(foo, Object.class));
        }
        reader.moveUp();
        return foo;
    }

    @Override
    public boolean canConvert(Class type) {
        return type.equals(Foo.class);
    }
}

或者,即使值是null,我也写了节点,只是没有给它任何值,即:

writer.startNode("value");
if(foo.valueProperty.getValue() != null) {
    context.convertAnother(foo.valueProperty.getValue());
}
writer.endNode();

但是,这不起作用,因为结果值是使用“对象”而不是实际类型初始化的。

一个证明这一点的例子是: <value>0.0</value>产生一个Object,而不是Double。

如何使用XStream安全地将对象序列化为XML,同时还要考虑空对象?我曾考虑过向节点添加class属性,但是我发现可能会有更方便的方法。

0 个答案:

没有答案