Как преобразовать объект с помощью Custom Converter в XStream - PullRequest
0 голосов
/ 16 мая 2019

У меня есть такой класс:

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 к узлу, но подумал, что может быть более удобный способ.

...