【发布时间】: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