我打算使用序列化来保存用户修改的Bean - 以存储历史记录。但是ByteArrayOutputStream输出一个字节数组:byte []。如果我将它转换为String并将其转换回来,则无法对其进行反序列化。 - 怎么解释这个? 如果我使用字节数组存储在oracle中,那就太复杂了。有什么方法可以使String被反序列化?谢谢! 我是中国人,请原谅我的英语不好。 :)
答案 0 :(得分:2)
使用ObjectOutputStream
序列化和ObjectInputStream
反序列化对象。这些类的API文档中有一些示例,说明如何使用它们对文件进行序列化和反序列化。
请勿尝试强制byte[]
加入String
。 (你为什么要把它放在String
?)。序列化对象是二进制数据,而不是存储在String
中的文本字符。
答案 1 :(得分:0)
在byte []中,可以使用所有可能的字节值,即-128到127.但是,在文本中,这些值和值的组合可能无效,并且不会按预期转换为文本。
我建议您考虑基于文本的序列化,如XML或JSon。这些可以安全地读/写为文本。文本库序列化可以由人读取,如果要更正值,可以编辑为文本。
编辑:我会考虑使用XMLEncoder这是粗略的,但内置或XStream用于XML和JSon,它更灵活,更高效(但需要一些额外的库)
答案 2 :(得分:0)
简要回答:将字节数组编码为Base64字符串。
Base64是一种确保二进制数据可以作为文本存储和传输的方法 - 可以在Wikipedia上找到合理的解释;如果你不编码字节数组,数据很容易被使用不同的代码页等“破坏”。有一点需要注意 - base64编码将占用比字节数组更多的空间(所以一个20字节的字节数组)可能需要存储大约30个字符)
有许多可编码/解码的库Base64 Apache Commons Codec只是一个。有关使用哪个库的更多讨论,请参阅this question(JDK中有一个“私有”库,但某些开发人员可能认为使用它可能会有问题。)
因此,总而言之,要将对象序列化为字符串,我们将ObjectOutputStream
和ByeArrayOutputStream
转换为字节数组,然后使用Base64编码器将其转换为字符串。
要反序列化,请使用Base64解码器将字符串转换回字节数组,然后使用ByteArrayInputStream
和ObjectInputStream
将其读回。
答案 3 :(得分:0)
static final String SQL_SERIALIZE_OBJECT="insert into serialized_java_objects(serialized_id,object_name,serialized_object) values (ser_id_seq.nextval,?,?)";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(objectToBeSerilize);
byte[] serializeBytes = baos.toByteArray();
prepStatement = connection.prepareStatement(SQL_SERIALIZE_OBJECT);
prepStatement.setString(1, objectToBeSerilize.getClass().getName());
prepStatement.setBytes(2, serializeBytes);
prepStatement.executeUpdate();