我有两个类Foos
和Foo
应该可以从XML序列化/反序列化:
@XmlRootElement(name = "foos")
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "Foos", propOrder = { "foo" })
public class Foos {
protected Map<Foo, Foo> foo;
public Map<Foo, Foo> getFooMap() {
if (foo == null) {
foo = new HashMap<Foo, Foo>();
}
return this.foo;
}
@XmlElements(value = { @XmlElement })
public Collection<Foo> getFoo() {
return getFooMap().values();
}
}
和
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foo", propOrder = { "name" })
public class Foo {
protected String name;
public String getName() {
return name;
}
public void setName(String value) {
this.name = value;
}
}
出于算法原因,我不能使用List<Foo>
,但需要Map<Foo, Foo>
。每个Foo
都应作为键和值放入Map
中。
将Foos
对象编组为XML是可行的,因为我有getFoo
吸气剂,但不能从XML解组。这可能是因为解组器不知道如何将Foo
对象的xml序列转换为哈希映射。
如何告诉解组员?
我认为我需要这样的方法(伪代码):
public void fillMap(XMLSequence<Foo> sequence) {
for (Foo foo : sequence)
getFooMap().put(foo, foo);
}
然后它可能还需要一些xml注释。
任何提示都值得赞赏!
答案 0 :(得分:0)
我找到了使用两个字段的方法:
@XmlRootElement(name = "foos")
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "Foos", propOrder = { "fooList", "foo" })
public class Foos {
@XmlElement(name="foo")
protected List<Foo> fooList;
protected Map<Foo, Foo> foo;
public Map<Foo, Foo> getFooMap() {
if (foo == null) {
foo = new HashMap<Foo, Foo>();
if (fooList != null)
for (Foo f : fooList)
foo.put(f, f);
}
return this.foo;
}
@XmlElement
public Collection<Foo> getFoo() {
return getFooMap().values();
}
}
在解组期间,fooList
被来自<foo>...</foo>
xml元素的数据填充。
首次调用getFooMap
时,它会填充fooList
的内容(通过将相同的对象作为键和值)。
在编组期间,将调用方法getFoo
,该方法将返回foo
映射的值。