使用 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;
    } 
}

教程演示如何通过注册转换器来序列化第三方对象,如下所示:

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 是否始终是流式传输第三方课程的推荐做法?
  • 在哪种情况下,我可以使用转换器?
  • 有没有更好的简单XML教程/示例?

谢谢。


答案 1

我必须再次自己回答:-)

来自Simple XML项目负责人Niall Gallagher的建议,来自支持列表:

“您可以使用转换器或变换。我会说对于UUID来说,使用匹配器进行转换将是最简单的选择。

所以,我使用/并对此感到满意。这并不能改变对我不起作用的事实:-)Transform<T>MatcherConverter<T>


答案 2

我想我有这个问题的答案。

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

应该注册转换器并解决问题。


推荐