使用Java序列化来保存对象

时间:2012-03-08 07:49:49

标签: java serialization

我打算使用序列化来保存用户修改的Bean - 以存储历史记录。但是ByteArrayOutputStream输出一个字节数组:byte []。如果我将它转换为String并将其转换回来,则无法对其进行反序列化。 - 怎么解释这个?   如果我使用字节数组存储在oracle中,那就太复杂了。有什么方法可以使String被反序列化?谢谢!   我是中国人,请原谅我的英语不好。 :)

4 个答案:

答案 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中有一个“私有”库,但某些开发人员可能认为使用它可能会有问题。)

因此,总而言之,要将对象序列化为字符串,我们将ObjectOutputStreamByeArrayOutputStream转换为字节数组,然后使用Base64编码器将其转换为字符串。

要反序列化,请使用Base64解码器将字符串转换回字节数组,然后使用ByteArrayInputStreamObjectInputStream将其读回。

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