Я решил использовать Simple XML serialization и был увязан с основной проблемой. Я пытаюсь сериализация java.util.UUID
экземпляра класса в качестве конечного поля в этом маленьком классе:Сериализация сторонних классов с Simple XML (org.simpleframework.xml)
@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 там?
спасибо.
Вы пытались использовать аннотацию Convert и AnnotationStrategy с вашим конвертером? Это работало? – Mark
Очень же исключение с AnnotationStrategy. Аналогичный класс с полем 'java.net.URL' вместо UUID сериализуется в порядке с пользовательским конвертером. Существует встроенная поддержка для сериализации класса URL внутри Simple XML по классу URLTransform. – mschayna
Похоже, Convert предназначен только для настройки сериализации уже поддерживаемых классов, для классов unknown-for-Simple (например, 'java.util.UUID') необходимо создать соответствующий класс Transform и использовать его с пользовательским Matcher. –
mschayna