我有一个这样的班级:
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
属性,但是我发现可能会有更方便的方法。