序列化对象,解析为String并反序列化

时间:2014-05-13 07:37:04

标签: java serialization

我正在尝试序列化和对象,解析为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

3 个答案:

答案 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);