2

J2SEに付属するJAXB実装を使用して、HashMapプロパティを含むBeanをシリアル化します。これは次のように述べているので、これは箱から出してすぐに機能するはずだと思います

JAXB仕様は、Beanのプロパティとして使用される場合の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の代わりに出力 されます。に注釈を付けbeanてfrom@XmlRootElementを削除すると機能しますが、なぜそれが必要なのかわかりません。そんなはずなの?@XmlElementmap

4

1 に答える 1

1

説明はあなたがリンクしたウェブサイトで与えられます:

残念ながら、2.1以降、この処理はBeanプロパティに対してのみ定義され、HashMapをトップレベルオブジェクト(JAXBElementの値など)としてマーシャリングする場合には定義されません。このような場合、HashMapはJavaBeanとして扱われます。 HashMapをBeanとして見ると、ゲッターとセッターのプロパティのペアは定義されていないため、次のコードは次の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 に答える