我在Android上使用Simple XML framework进行反序列化。
我需要反序列化的xml大致如下:
<?xml version="1.0" encoding="UTF-8"?>
<elements type="array">
<element foo="x"/>
<element foo="y"/>
</elements>
换句话说,它是根级别的数组。
如何定义我可以反序列化的模型类?
我尝试了以下内容:
@Root (name = "elements")
public class Elements implements Serializable {
private static final long serialVersionUID = ...
@ElementArray (name = "element")
private List<Element> elements;
}
但它失败了,因为没有type
字段来说明xml中的type
属性。
添加type
字段(仅为了满足解串器)不能解决问题,而是生成另一个错误:org.simpleframework.xml.core.InstantiationException: Type is not an array interface java.util.List for field 'elements' ...
实施Elements
课程的正确方法是什么?即使在时间压力下,我想要一个干净的解决方案,而不是一些hackish解决方法(我可能会想到)。
答案 0 :(得分:1)
在Elements类中,您应该使用@ElementList
并添加名为&#34的属性;键入&#34;
@ElementList(name="elements", inline=true)
private List<Element> elements;
@Attribute(name="type")
private String type;
此外,如果您不想打扰xml中的type
属性,只需添加required=false
,如下所示:
@Attribute(name="type", required=false)
答案 1 :(得分:1)
正确的解决方案是:
public class Elements implements Serializable {
private static final long serialVersionUID = ...
@Attribute (name = "type", required = false)
private String type;
@ElementList (name = "elements", entry = "element", inline = true)
private List<Element> elements;
}
J. Marcos
的回答是正确的,指出我应该使用ElementList
和inline
属性。
仍然缺少的是删除Root
注释(我猜它与内联列表的想法冲突),并添加entry
属性,该属性指定数组元素的名称。
如果标记与字段名称相同(如我的设计示例中),则可能不需要,但如果它们不同(例如,类中的elementItem
和element_item
中的{{1}} xml),显然是。