2013-05-07 60 views
1

我在java中有xml序列化的问题。其实我不得不做出一个xml头到我的加密程序,它应该是这样的:Byte array java xml serialization

<EncryptedFileHeader> 
    <Algorithm>algorithm name</Algorithm> 
    <KeySize>key size</KeySize> 
    <BlockSize>block size</BlockSize> 
    <CipherMode>mode</CipherMode> 
    <IV>initial vector</IV> 
    <ApprovedUsers> 
     <User> 
      <Email>mail</Email> 
      <SessionKey>session key</SessionKey> 
     </User> 
    </ApprovedUsers> 
</EncryptedFileHeade> 
*ciphered data* 

,其中加密数据是从头部的。 我考虑一个xml豆,但它给了我这样的节点性能的开销数据和属性,如:

<void property="approvedUsers"> 
    <void index="0"> 

JAXB给人相当不错的诺德望风,但我每次经过数据转换为Base64编码。这是最大的问题。 “加密数据”和“会话密钥”必须以纯二进制格式(byte [])存储。即使我使用XML豆类它存储这样的:

<array class="byte" length="428704"> 
    <void index="0"> 
<byte>43</byte> 
</void> 
<void index="1"> 
<byte>93</byte> 
</void> 
<void index="2"> 
<byte>76</byte> 
</void> 
<void index="3"> 
<byte>48</byte> 
</void> 
<void index="4"> 
... 

另一种方法是JAXB与快速信息集..但我不知道是否有针对此问题的另一种简单sollution。

编辑: 在这里,我找到了我的问题/一些解释误会enter link description here

+1

要以XML格式存储任意的二进制数据,您必须将其编码在允许的字符集内。这通常意味着base64。 – 2013-05-07 16:25:40

回答

0

此问题的解决方法是用jaxb序列化一个流中的头并关闭它。然后在下一个流中使用另一个流序列化到现有标题。要反序列化,只需将它作为文本流读取并使用正则表达式查找第一个结尾“”,将其解组为一个对象。检查其大小并跳过标题读取另一个流中的此文件以解密加密数据

0

随着JAXB(JSR-222)实现你的可以编写XmlAdapterbyte[]转换为您想要的任何表示形式,如果默认表示法不充分。

public class ByteArrayAdapter extends XmlAdapter<String, byte[]> { 
    ... 
}