UUID转换器没有注册

时间:2014-08-21 16:34:05

标签: java simple-framework

我有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>

1 个答案:

答案 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"));
}