使用Simple XML(org.simpleframework.xml)序列化第三方类

时间:2010-09-02 10:29:24

标签: java xml-serialization simple-framework

我决定使用Simple XML serialization并且遇到了基本问题。我试图将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();
    }
}

问题:

  • 自定义匹配器总是推荐用于流式传输第三方类的练习吗?
  • 在哪种情况下我可以使用Converter?
  • 还有更好的Simple XML教程/示例吗?

谢谢。

3 个答案:

答案 0 :(得分:16)

我必须自己回答: - )

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

  

“你可以使用转换器或转换。我会说       对于UUID,使用Matcher进行转换将是最简单的选择。“

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

答案 1 :(得分:1)

我想我有答案。

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

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

答案 2 :(得分:0)

我知道这有点大,但我有机会遇到同样的例外。

实际问题是使用@Attribute注释。如果不是@Attribute 你把@Element放在异常中没有出现,转换器用于序列化。

我想这将取决于您使用哪个注释创建转换器或使用Marker-Transform解决方案。虽然我不知道这是否是有意的行为。