Jaxb解组要映射的xml序列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jaxb解组要映射的xml序列相关的知识,希望对你有一定的参考价值。
我有两个类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
getter,但是从XML解组却没有。这可能是因为unmarshaller不知道如何将Foo
对象的xml序列转换为哈希映射。
我怎么能告诉unmarshaller?
我想我需要一个像这样的方法(伪代码):
public void fillMap(XMLSequence<Foo> sequence) {
for (Foo foo : sequence)
getFooMap().put(foo, foo);
}
然后它可能还需要一些xml注释。
任何提示都表示赞赏!
答案
我发现了一种使用两个字段的方法:
@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
映射的值。
以上是关于Jaxb解组要映射的xml序列的主要内容,如果未能解决你的问题,请参考以下文章