通过 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>
我是 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>