JAXB(联合国)xsd类型的编组:xsd:base64Binary和xsd:hexBinary

时间:2010-11-17 06:43:46

标签: xml xsd jaxb unmarshalling

JAXB将xsd:base64Binaryxsd:hexBinary类型映射到byte[]

鉴于我有一个架构/一个DOM元素代表这些类型中的每一个,例如:

<foo>ABCD</foo>表示xsd:hexBinary和
<foo>YTM0NZomIzI2OTsmIzM0NTueYQ==</foo>表示xsd:base64Binary,

目前尚不清楚JAXB 2.1如何处理它。

JAXB.unmarshal(new DOMSource(node), byte[].class)不喜欢有效载荷。
以下都没有:

JAXBContext ctx = JAXBContext.newInstance(byte[].class); ctx.createUnmarshaller().unmarshal(node);

处理这些类型的正确方法是什么? 提前谢谢。

1 个答案:

答案 0 :(得分:13)

byte []与hexBinary或base64Binary表示之间的转换是通过对应的XmlAdapter完成的。

默认情况下,JAXB使用包含的HexBinaryAdapter将byte []转换为String。 我不知道是否还有一个XmlAdapter从/转换为base64但是没问题:

您可以使用自己的XmlAdpater轻松实现它:

public final class Base64Adapter extends XmlAdapter<String, byte[]> {
    public byte[] unmarshal(String s) {
        if (s == null)
            return null;
        return org.apache.commons.codec.binary.Base64.decodeBase64(s);
    }

    public String marshal(byte[] bytes) {
        if (bytes == null)
            return null;
        return org.apache.commons.codec.binary.Base64.encodeBase64String(bytes);
    }
}

您可以在字段/ getter_setter级别指定应由哪个适配器处理的内容:

private class DataTestClass {

    @XmlJavaTypeAdapter(Base64Adapter.class)
    public byte[] base64Data = new byte[] { 0, 1, 2, 3, 4 };

    @XmlJavaTypeAdapter(HexBinaryAdapter.class)
    public byte[] hexbinData = new byte[] { 0, 1, 2, 3, 4 };

}