gpt4 book ai didi

xml - JAXB (un) xsd 类型编码 : xsd:base64Binary and xsd:hexBinary

转载 作者:数据小太阳 更新时间:2023-10-29 01:53:22 52 4
gpt4 key购买 nike

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);

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

最佳答案

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

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

您可以使用自己的 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 };

}

关于xml - JAXB (un) xsd 类型编码 : xsd:base64Binary and xsd:hexBinary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4202108/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com