使用Simple XML(org.simpleframework.xml)序列化第三方类

我决定使用Simple XML序列化,并且遇到了基本问题。 我试图将java.util.UUID类实例序列化为这个小类中的f​​inal字段:

 @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 { @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字段的序列化对象期间抛出exception不支持类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 { @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的更好的教程/示例吗?

谢谢。

我必须自己回答:-)

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

“你可以使用转换器或转换器。我想对于UUID来说,使用匹配器的转换将是最简单的选择。”

所以,我使用Transform / Matcher并对它感到满意。 这并没有改变Converter对我不起作用的事实:-)

我想我有答案。

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

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

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

实际问题是使用@Attribute注释。 如果不是@Attribute而是放置@Element,则不会出现exception,并且转换器用于序列化。

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