Подтвердить что ты не робот

Сериализация сторонних классов с помощью Simple XML (org.simpleframework.xml)

Я решил использовать Простую XML-сериализацию и был связан с основной проблемой. Я пытаюсь сериализовать экземпляр класса java.util.UUID как конечное поле в этом маленьком классе:

@Root
public class Identity {
    @Attribute
    private final UUID id;

    public Identity(@Attribute UUID id) {
        this.id = id;
    } 
}

Tutorial показывает, как сериализовать сторонние объекты, зарегистрировав преобразователи следующим образом:

Registry registry = new Registry();
registry.bind(UUID.class, UUIDConverter.class);
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);

serializer.write( object, stream );

соответствующий конвертер для UUID довольно прост:

public class UUIDConverter implements Converter<UUID> {
    @Override
    public UUID read(InputNode node) throws Exception {
       return new UUID.fromString(node.getValue());
    }
    @Override
    public void write(OutputNode node, UUID value) throws Exception {
       node.setValue(value.toString());
    }
}

Но этот простой код просто не работал у меня, в процессе сериализации объектов с полями UUID было выбрано исключение Преобразование класса java.util.UUID не поддерживается.

Я пробовал что-то подобное с пользовательским Matcher (который не был в учебнике), который работает для меня:

Serializer serializer = new Persister(new MyMatcher());

serializer.write( object, stream );

и Matcher класс выглядит следующим образом:

public static class MyMatcher implements Matcher {
    @Override
    @SuppressWarnings("unchecked")
    public Transform match(Class type) throws Exception {
        if (type.equals(UUID.class))
            return new UUIDTransform();
        return null;
    }
}

public class UUIDTransform implements Transform<UUID> {
    @Override
    public UUID read(String value) throws Exception {
        return UUID.fromString(value);
    }
    @Override
    public String write(UUID value) throws Exception {
        return value.toString();
    }
}

Вопросы:

  • Пользовательский Matcher всегда рекомендуется применять для потоковой передачи сторонних классов?
  • В этом случае я могу использовать Конвертер?
  • Есть ли лучшие учебники/примеры для Simple XML там?

Спасибо.

4b9b3361

Ответ 1

Я должен ответить сам за себя: -)

Совет от Niall Gallagher, руководителя проекта Simple XML, из списка поддержки:

"Вы можете использовать либо конвертер, либо преобразование. Я бы сказал     для UUID преобразование с помощью Matcher было бы самым простым вариантом.

Итак, я использую Transform<T>/Matcher и удовлетворен этим. Это не меняет того факта, что Converter<T> не работает для меня: -)

Ответ 2

Думаю, у меня есть ответ на этот вопрос.

Strategy strategy = new AnnotationStrategy();
Serializer serializer = new Persister(strategy);

должен зарегистрировать преобразователь и решить проблему.

Ответ 3

Я знаю, что это небольшая часть, но у меня есть шанс, что я пришел к тому же самому исключению.

Актуальной проблемой является использование аннотации @Attribute. Если вместо @Attribute вы ставите @Element, исключение не появляется, а конвертер используется для сериализации.

Я предполагаю, что это будет зависеть от того, какую аннотацию вы использовали, чтобы создать конвертер или использовать решение Marker-Transform. Хотя я не знаю, является ли это обычным поведением.