字节数组在JAXB类中不起作用

时间:2011-01-02 03:05:37

标签: java jaxb

我正在尝试使用像这样的字节数组(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;
}

2 个答案:

答案 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;
    }