我有3节课。文件夹,笔记本和基类。
public abstract class NotebookBase {
@Attribute(name = "name") String mName;
@Attribute(required = false) UUID mUuid;
}
public class NotebookFolder extends NotebookBase{
@ElementListUnion({
@ElementList(name = "folder", type = NotebookFolder.class, inline = true, required = false),
@ElementList(name = "notebook", type = Notebook.class, inline = true, required = false)})
private List<NotebookBase> mChildren = new ArrayList<NotebookBase>();
}
public class Notebook extends NotebookBase {
@Attribute (name = "page_count") private int mPageCount = 0;
}
和一个简单的转换器:
public class UuidConverter implements Converter<UUID>{
@Override
public UUID read(InputNode node) throws Exception
{
return UUID.fromString(node.getAttribute("id").getValue());
}
@Override
public void write(OutputNode node, UUID value) throws Exception
{
node.setAttribute("id", value.toString());
}
}
我已尝试按tutorial。
中所述注册转换器Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(UUID.class, UuidConverter.class);
我尝试序列化文件夹及其子文件夹和笔记本的实例,但输出为空。
我在转换器中放置断点并且根本没有被调用。
使其发挥作用的唯一方法是改变
@Attribute(name="id") UUID mUuid;
//to
@Element(name="id") UUID mUuid;
但这会炸毁xml
<folder name="documents">
<folder name="Maths">
<mUuid>
<mostSigBits>8900925522479825724</mostSigBits>
<leastSigBits>-8963928029250572835</leastSigBits>
</mUuid>
<folder name="Exams">
<mUuid>
<mostSigBits>3462229032913685898</mostSigBits>
<leastSigBits>-5566328454854271064</leastSigBits>
</mUuid>
<notebook name="Exam1" page_count="11">
<mUuid>
<mostSigBits>-5326841338587362547</mostSigBits>
<leastSigBits>-7556397486665814697</leastSigBits>
</mUuid>
</notebook>
</folder>
</folder>
我更愿意将UUID作为属性,而不是像这样的元素:
<folder name="documents">
<folder name="Maths" id="7b86709a-839e-433c-8399-baf3485a2ddd">
<folder name="Exams" id="300c4ef6-35dd-4d8a-b2c0-6dc311431fa8">
<notebook name="Exam1" id="b6134206-7ea2-4b0d-9722-488579a12d57" page_count="11"/>
</folder>
</folder>
答案 0 :(得分:0)
我发现你做错了两件事情如下:
首先在代码中声明属性时,需要同时声明转换器:
public abstract class NotebookBase {
...
@Attribute(required = false)
@Convert(UuidConverter.class)
UUID mUuid;
}
其次,在你的转换器中,getAttribute函数返回attrubute的值,调用getValue()就意味着一个元素,所以正确的代码看起来像这样:
public class UuidConverter implements Converter<UUID>{
@Override
public UUID read(InputNode node) throws Exception
{
return UUID.fromString(node.getAttribute("id"));
}