我决定使用简单XML序列化,并且遇到了基本问题。我试图java.util.UUID在这个小类中将类实例序列化为final字段:
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(教程中没有介绍)对我有用:
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(); } }
问题:
谢谢。
我必须自己再回答一次:-)
来自支持列表的Simple XML项目负责人Niall Gallagher的建议:
“您可以使用Converter或Transform。对于UUID,带Matcher的Transform是最简单的选择。”
因此,我使用Transform<T>/ Matcher并对此感到满意。这不会改变以下事实:Converter<T>不适用于我:-)
Transform<T>
Converter<T>