【问题标题】:Serialization third-party classes with Simple XML (org.simpleframework.xml)使用简单 XML 序列化第三方类 (org.simpleframework.xml)
【发布时间】:2011-04-07 06:34:29
【问题描述】:

我决定使用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 字段的对象期间抛出异常 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 是否始终推荐用于流式传输第三方类?
  • 在什么情况下可以使用 Converter?
  • 有没有更好的简单 XML 教程/示例?

谢谢。

【问题讨论】:

  • 您是否尝试在转换器中使用 Convert 注释和 AnnotationStrategy?有效果吗?
  • AnnotationStrategy 的例外情况非常相似。具有java.net.URL 字段而不是UUID 的类似类可以使用自定义转换器进行序列化。通过 URLTransform 类对 Simple XML 中的 URL 类进行序列化的内置支持。
  • 看起来 Convert 仅用于自定义已支持类的序列化,对于未知的简单类(例如 java.util.UUID)是必要的,创建适当的 Transform 类并使用它与自定义匹配器。
  • 我删除了 static 以使其正常工作
  • 对不起static,这个例子只是测试中的内部类。很高兴看到我不起眼的帖子总是相关的 :-) 我不再使用 Simple XML,我必须使用 JAXB

标签: java xml-serialization simple-framework


【解决方案1】:

我又要自己回答了:-)

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

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

所以,我使用Transform&lt;T&gt;/Matcher 并满意。这不会改变Converter&lt;T&gt; 对我不起作用的事实:-)

【讨论】:

  • 非常有用的问题和(自我)答案:-)!帮助我完成了申请!
  • 这比简单 XML 的“文档”更有帮助。
【解决方案2】:

我想我有这个答案。

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

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

【讨论】:

    【解决方案3】:

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

    实际的问题是@Attribute 注解的使用。如果不是@Attribute 你把@Element 不出现异常和转换器用于序列化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2021-11-03
      • 1970-01-01
      • 2011-01-21
      • 2020-03-13
      • 1970-01-01
      相关资源
      最近更新 更多