我在java中遇到xml序列化问题。实际上我必须为我的加密程序制作一个xml标题,如下所示:
<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 bean,但它给了我很多开销数据,比如节点属性和属性,如:
<void property="approvedUsers">
<void index="0">
JAXB提供了非常好的noode了望,但我传递的每个数据都转换为Base64。这是最大的问题。 “加密数据”和“会话密钥”必须以纯二进制格式(byte [])存储。即使我使用xml bean,它也会像这样存储:
<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具有快速信息集..但我想知道是否有另一个简单的解决方案来解决这个问题。
编辑: 在这里,我找到了一些解释我的问题/误解enter link description here
答案 0 :(得分:1)
您不能在XML中放置任何字节,有限制,请参阅http://en.wikipedia.org/wiki/Valid_characters_in_XML
答案 1 :(得分:0)
使用JAXB(JSR-222)实现,如果默认表示不够,您可以编写XmlAdapter
将byte[]
转换为您想要的任何表示。
public class ByteArrayAdapter extends XmlAdapter<String, byte[]> {
...
}
答案 2 :(得分:0)
此问题的解决方法是使用jaxb序列化一个流中的标头并关闭它。并在下一个流序列化到另一个流的现有标头。要反序列化,只需将其读作文本流并使用正则表达式查找第一个结尾“”,将其作为对象解组。检查此大小并跳过标题在另一个流中读取此文件以对加密数据进行desierialize。