如何用简单XML序列化第三方类(org.simpleframework.xml)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (139)

我正在尝试序列化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,有没有更好的教程/示例?
提问于
用户回答回答于

我用Transform<T>/Matcher并对此感到满意。这不会改变以下事实:Converter<T>。

用户回答回答于

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

扫码关注云+社区