使用Simple XML(org.simpleframework.xml)序列化第三方类
我决定使用Simple XML序列化,并且遇到了基本问题。 我试图将java.util.UUID
类实例序列化为这个小类中的final字段:
@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解决方案。 虽然我不知道这是否是有意的行为。