2013-05-07 51 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[]> { 
    ... 
}