簡體   English   中英

Jaxb解組XML序列以進行映射

[英]Jaxb unmarshal xml sequence to map

我有兩個類FoosFoo ,它們應該可以從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解組則沒有。 這可能是因為解組器不知道如何將Foo對象的xml序列轉換為哈希映射。

我該如何告訴解組員?

我想我需要這樣的方法(偽代碼):

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調用getFooMap時,它將填充fooList的內容(通過將相同的對象作為鍵和值放置)。

  • 在編組期間,將調用getFoo方法,該方法將返回foo映射的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM