我正在尝试使用像这样的字节数组(JAXB类)。但是,即使我传递了有效字符,我也会在msg字段中获取全0。 “id”和“myid”字段被成功解析,并且字节数组字段失败。
@XmlRootElement(name = "testMessage") @XmlAccessorType(XmlAccessType.FIELD) public class TestMessage { @XmlAttribute private Integer id; @XmlElement(name = "myid") private Long myid; @XmlElement(name = "msg") private byte[] msg; }
答案 0 :(得分:4)
使用Java 1.6.0_23的JAXB,我获得了一个TestMessage实例的以下xml文件:
TestMessage testMessage = new TestMessage();
testMessage.id = 1;
testMessage.myid = 2l;
testMessage.msg = "Test12345678".getBytes();
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testMessage id="1">
<myid>2</myid>
<msg>VGVzdDEyMzQ1Njc4</msg>
</testMessage>
如果你解组这个xml内容,你应该返回TestMessage实例,包括msg字节数组(在xml文件中是base64编码的)。
答案 1 :(得分:0)
您可以将 xml适配器用于字节数组xml元素。如您现在所述,每个元素都得到 marshalling / unmarshalling ,并且适配器用于诸如以指定格式转换日期时间,在进行marshalling / unmarshalling时键入类型转换等情况。
HexBinaryAdapter类是属于javax.xml.bind.annotation.adapters的那些适配器之一,因此您可以使用它。
public class TestMessage {
@XmlAttribute
private Integer id;
@XmlElement(name = "myid")
private Long myid;
@XmlJavaTypeAdapter(HexBinaryAdapter.class)
@XmlElement(name = "msg")
private byte[] msg;
}
但是,如果您喜欢自定义转换,则可以创建自己的适配器以转换指定格式(例如base64等)的字节。
为此,您必须编写自己的解组/编组方法,
public final class MyAdapter extends XmlAdapter<String, byte[]> {
public byte[] unmarshal(String s) {
if (s == null)
return null;
return decode()); // your way to decode.
}
public String marshal(byte[] bytes) {
if (bytes == null)
return null;
return encode(); //your way to encode
}
}
然后,然后在@XmlJavaTypeAdapter注释中给您的编组器/取消编组器添加注释;
public class TestMessage {
@XmlAttribute
private Integer id;
@XmlElement(name = "myid")
private Long myid;
@XmlJavaTypeAdapter(MyAdapter.class)
@XmlElement(name = "msg")
private byte[] msg;
}