17

我决定使用简单的 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 字段的序列化对象期间抛出异常Transform of class java.util.UUID not supported

我尝试了一些与自定义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 教程/示例?

谢谢你。

4

3 回答 3

16

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

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

“你可以使用转换器或转换。我会说对于 UUID,带有匹配器的转换将是最简单的选择。”

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

于 2010-09-08T14:20:25.197 回答
1

我想我有这个答案。

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

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

于 2013-05-16T09:17:28.150 回答
0

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

实际问题是 @Attribute 注释的使用。如果您使用@Element 而不是@Attribute,则不会出现异常,并且转换器用于序列化。

我想这将取决于您使用的注释,您应该创建一个转换器或使用标记转换解决方案。虽然我不知道这是否是有意的行为。

于 2016-01-15T09:30:19.537 回答