2

我正在使用 J2SE 附带的 JAXB 实现来序列化包含 HashMap 属性的 bean。我认为这应该是开箱即用的,因为 表明

当将 Map 用作 bean 的属性时,JAXB 规范定义了对 Map 的特殊处理。例如,以下 bean 将生成如下 XML: ...

除非结构具有多个级别,否则这或多或少有效,即 HashMap 是 bean 的属性,它是 bean 的属性 - 如下所示:

import java.util.HashMap;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.JAXB;

class bean { 
    @XmlElement public HashMap<String,String> map;
}

@XmlRootElement class b2 { 
    @XmlElement public bean b;
}


class foo { 
    public static void main(String args[]) { 
        try { 
            bean b = new bean();
            b.map = new HashMap<String,String>();
            b.map.put("a","b");
            b2 two = new b2();
            two.b=b;
            JAXB.marshal(two, System.out);  

        } catch (Exception e) { 
            System.out.println("Exception: " + e.toString());
        }
    }
}

这将输出 <?xml version="1.0" encoding="UTF-8" standalone="yes"?><b2><b><map/></b></b2>而不是正确格式化的 HashMap。如果我用 from 注释并删除它,它会起作用bean,但@XmlRootElement我不明白为什么这应该是必要的。应该是这样吗?@XmlElementmap

4

1 回答 1

1

您链接的网站上给出了解释:

不幸的是,从 2.1 开始,此处理仅针对 bean 属性定义,而不是当您将 HashMap 编组为顶级对象(例如 JAXBElement 中的值)时。在这种情况下,HashMap 将被视为 Java bean,并且当您将 HashMap 视为一个 bean,它没有定义 getter/setter 属性对,因此以下代码将生成以下 XML:

带地图的 Bean:

m = new HashMap();
m.put("abc",1);
marshaller.marshal(new JAXBElement(new QName("root"),HashMap.class,m),System.out);

XML 表示:

<root />

此问题已记录为 #223,需要在更高版本的 JAXB 规范中进行修复。

于 2011-07-14T13:50:14.127 回答