我决定使用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();
}
}
问题:
谢谢。
答案 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解决方案。虽然我不知道这是否是有意的行为。