通过 ID 引用字段而不是扩展它

Referencing a field by its ID instead of expanding it

我是 XML (Java) 和 运行 的简单框架的新手,遇到序列化特定 class 结构的问题。

我有两个 classes:

@Root(name="static")
class StaticData {
  @Attribute
  private String id;
  @Attribute
  private String value;
 ...
}

@Root(name="listdata")
class ListData {
  // Problem field
  @Attribute
  private StaticData ref;
  @Element
  private String name;
}

并收到 “T运行sformException:不支持 class 静态数据的 T运行sform”。 我希望 ListData 中的 ref-field 不扩展到静态数据 XML 结构中(然后 @Element 就可以了),而是要获取引用。

<listdata ref="foo">
  <name>bla bla</name>
</listdata>

其中 "foo" 是已加载到我的应用程序中的某些 StaticData 对象中 "id" 的有效值。

在 JAXB 中,我会使用 XmlJavaTypeAdapter 注释

@XmlAttribute(name="id")
@XmlJavaTypeAdapter(MyStaticDataAdapter.class)

但我似乎无法在 Simple 中找到等效的工作。

有疑问,您可以使用 Converter 来实现这种行为。

举个例子:

@Root(name = "listdata")
@Convert(ListData.ListDataConverter.class)
class ListData
{
    @Attribute
    private StaticData ref;
    @Element
    private String name;

    // ...

    // Converter implementation
    static class ListDataConverter implements Converter<ListData>
    {

        @Override
        public ListData read(InputNode node) throws Exception
        {
            /*
             * In case you also want to read, implement this too ...
             */
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public void write(OutputNode node, ListData value) throws Exception
        {
            node.setAttribute("ref", value.ref.getId());
            node.getChild("name").setValue(value.name);
        }
    }
}

用法:

Serializer ser = new Persister(new AnnotationStrategy());
                            /* ^----- important! -----^ */

ListData ld = ...
ser.write(ld, System.out); // Serialize to std out

输出

有了这些 ListData 值 ...

  • 名称 = abcdefg
  • 参考 = ...
    • id = 123
    • 值 = 这是一个值

你会得到...

<listdata ref="123">
   <name>def</name>
</listdata>