Java JAXB将字节[]写入和读取到xml-不同的值

Java JAXB将字节[]写入和读取到xml-不同的值,java,jaxb,byte,Java,Jaxb,Byte,我尝试将字符串转换为字节数组(byte[]),并将其保存在xml文件中。 我的问题是,在用jaxb封送和解封送对象之后,字节[]的值不同 我很抱歉我的发帖格式 ` @XmlRootElement 公共类令牌{ 专用字节[]令牌; public void createToken(){ 字符串stringTest=“ABCDEF”; this.token=stringTest.getBytes(Charset.forName(“UTF-8”); } 公共字节[]getToken(){ 返回令牌; }

我尝试将字符串转换为字节数组(byte[]),并将其保存在xml文件中。 我的问题是,在用jaxb封送和解封送对象之后,字节[]的值不同

我很抱歉我的发帖格式

`

@XmlRootElement
公共类令牌{
专用字节[]令牌;
public void createToken(){
字符串stringTest=“ABCDEF”;
this.token=stringTest.getBytes(Charset.forName(“UTF-8”);
}
公共字节[]getToken(){
返回令牌;
}
公共void setToken(字节[]令牌){
this.token=token;
}
}//ENDE类令牌
@XmlRootElement(namespace=“tokens”)
公共类令牌集合{
私有列表集合=新的ArrayList();
public void addToken(字节[]tokenIn){
this.collection.add(tokenIn);
}
@xmlement(name=“TokenCollection”)
公共列表getTokenCollection(){
退回此项。收藏;
}
公开无效测试(){
令牌t=新令牌();
t、 createToken();
字节[]tmp=t.getToken();
这个.addToken(tmp);
}
}//ENDE TOKENCOLLECTION
开胃菜:
公众发起者(){
Path=Paths.get(“triple.xml”);
tc.test();
JAXB.marshal(tc,System.out);
try(Writer out=Files.newBufferedWriter(路径,StandardCharsets.UTF_8)){
JAXB.marshal(tc,out);
}捕获(io异常){
io.printStackTrace();
}
}
`

输出: 应该是: 656667686970

XML-FILE(具有错误的值):

QUJDREVG

现在,在您编辑您的文章之后,它可以完美地工作

我用以下代码读取XML,最后它打印出相同的
“ABCDEF”
字符串:

Path path = Paths.get("trivial.xml");
TokenCollection tc = JAXB.unmarshal(path.toFile(), TokenCollection.class);

// Prints "ABCDEF"
System.out.println(new String(tc.getTokenCollection().get(0),
    StandardCharsets.UTF_8));

JAXB(JSR-222)实现将XML中的
byte[]
表示为
base64Binary
模式类型。如果您想要另一种表示法,您可以使用
XmlAdapter

您可以发布结果XML文件吗?结果在“token”标记(记事本++):`QUJDREVG 6`中,
标记的类型是什么?还可以发布
TokenCollection
类吗?我们假设JAXB在封送处理过程中以某种方式转换值(介于-128和127之间)。也许xml文件是由JAXB以不同的字符集编写的,或者是以这个方向编写的,我无法获得正确的原始值。不,JAXB可以很好地处理字节数组。字节数组在XML中表示为Base64字符串。昨天我们测试了算法,没有问题,除非我写和读XML文件。我写入文件的字节数组中的值由以下代码片段生成:`SecureRandom random=new SecureRandom();this.setToken(新字节[this.getTokenWidth()]);random.nextBytes(getToken())`从另一个角度来看:我只需要代码将带有随机值的字节数组存储在xml文件中并还原这些值。令牌类对象或多或少只是一个具有给定长度的简单字节数组。tokencollection有一个token列表,而tokencollection正是我试图保存在xml文件中的内容。但是封送拆收器似乎改变了数组中的值,因为简单的值“ABCDEF..”(dec:65,66,67..n)在文件中不可读。问题是对象本身改变了字节数组。用随机值填充是可以的,但是在类外执行。
Path path = Paths.get("trivial.xml");
TokenCollection tc = JAXB.unmarshal(path.toFile(), TokenCollection.class);

// Prints "ABCDEF"
System.out.println(new String(tc.getTokenCollection().get(0),
    StandardCharsets.UTF_8));