我正在使用J2SE附带的JAXB实现来序列化包含HashMap属性的bean。我认为这应该是开箱即用的 this个州
JAXB规范定义了Map作为bean的一个特性时的特殊处理。例如,以下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。如果我使用bean
注释@XmlRootElement
并从@XmlElement
删除map
,它就有效,但我不明白为什么这是必要的。这应该是那样的吗?
答案 0 :(得分:1)
您在链接的网站上提供了解释:
不幸的是,从2.1开始,这个处理只为bean定义 属性而不是当您将HashMap编组为顶级对象时 (例如JAXBElement中的值。)在这种情况下,HashMap将是 被视为Java bean,当你将HashMap视为bean时 没有定义getter / setter属性对,所以下面的代码会 产生以下XML:
Bean with Map:
m = new HashMap();
m.put("abc",1);
marshaller.marshal(new JAXBElement(new QName("root"),HashMap.class,m),System.out);
XML表示:
<root />
此问题已记录为#223,需要进行修复 更高版本的JAXB规范。