У меня есть такой класс:
class Foo {
public ObjectProperty<Object> valueProperty;
Foo() {
valueProperty = new SimpleObjectProperty<>();
}
}
Я хотел бы преобразовать объекты типа Foo
в XML с использованием XStream, однако мне нужно сделать это с помощью специального конвертера, поскольку Foo содержит JavaFX свойство , которое нельзя легко сериализовать.Специфика не важна, все, что вам нужно знать, это то, что getValue
свойства может возвращать нуль.
Мой текущий подход:
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);
}
}
в качестве альтернативы, я написалузел, даже если значение равно нулю, и просто не присвоено ему никакого значения, например:
writer.startNode("value");
if(foo.valueProperty.getValue() != null) {
context.convertAnother(foo.valueProperty.getValue());
}
writer.endNode();
Однако это не работает, поскольку результирующее значение инициализируется с помощью «Объекта» вместо фактического типа.
Пример, демонстрирующий это: <value>0.0</value>
дает объект вместо Double.
Как можно безопасно сериализовать объекты в XML с использованием XStream, а также учитывать нулевые объекты?Я думал о добавлении атрибута class
к узлу, но подумал, что может быть более удобный способ.