2010-09-02 7 views
17

Я решил использовать 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 там?

спасибо.

+0

Вы пытались использовать аннотацию Convert и AnnotationStrategy с вашим конвертером? Это работало? – Mark

+0

Очень же исключение с AnnotationStrategy. Аналогичный класс с полем 'java.net.URL' вместо UUID сериализуется в порядке с пользовательским конвертером. Существует встроенная поддержка для сериализации класса URL внутри Simple XML по классу URLTransform. – mschayna

+3

Похоже, Convert предназначен только для настройки сериализации уже поддерживаемых классов, для классов unknown-for-Simple (например, 'java.util.UUID') необходимо создать соответствующий класс Transform и использовать его с пользовательским Matcher. – mschayna

ответ

16

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

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

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

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

+0

Очень полезный вопрос и (сам) ответ :-)! Помог мне по моему заявлению! –

+4

Это было более полезно, чем «документация» для Simple XML. –

1

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

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

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

0

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

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

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

Смежные вопросы