我正在尝试序列化和对象,解析为String并反序列化,但它不起作用。当我将byte []解析为String或反之亦然时,我想我错过了一些东西。
String obj = new String(SerializationUtils.serialize(configuration));
Configuration test = (Configuration)SerializationUtils.deserialize(obj.getBytes());
为什么不起作用?
我收到此错误:
org.apache.commons.lang.SerializationException: java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
at org.apache.commons.lang.SerializationUtils.deserialize(SerializationUtils.java:168)
at org.apache.commons.lang.SerializationUtils.deserialize(SerializationUtils.java:193)
解决方案:
将字节[]编码并加载到Base64
答案 0 :(得分:5)
添加信息后,这很容易回答。
序列化数据是一个字节数组,但您将其包装在String对象中。 String对象具有自己的魔力 - 在这种情况下使用了UTF8-Charset。
UTF8类似BOM ("Byte Order Mark"),用作String对象的内部头。这个BOM(由数据EF BB BF
组成,它被定义为那样。请注意,它与您的异常中的数据完全相同!)是String的字节的一部分(第一个)准确地说是3个字节)。这会使反序列化变得混乱,因为对于deserialize
方法,这3个字节是垃圾。
这就是你得到例外的原因。
我强烈建议不要使用String
作为原始二进制数据的容器,例如序列化的byte[]
。
由于您说远程系统只允许使用String,因此请尝试使用不是UTF8的不同字符集创建创建字符串,或者找到禁用BOM的方法。
答案 1 :(得分:1)
然而,在Strings中存储敏感数据并不是一个好主意,这里是代码,它将完成这项工作:
Javascript
答案 2 :(得分:0)
另一种方法是使用java.lang.Base64将字节数组解码并编码为base64并存储/读取该值。
示例代码:
byte[] input = SerializationUtils.serialize(yourObject);
String encodedInput = Base64.getEncoder().encodeToString(input);
byte[] decodedOutput = Base64.getDecoder().decode(encodedInput);
Object output = SerializationUtils.deserialize(decodedOutput);