如何序列化Java对象 - 将对象转换为InputStream

时间:2013-06-12 04:06:57

标签: java object-serialization

如果我像这样编写代码,则会出现错误“文件未找到访问被拒绝......”

public class ImplRegistration implements IRegistration {
 @Override
    public boolean newRegistration(Registration_BE reg_be) {
        FileOutputStream fos = new FileOutputStream("serial.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(reg_be);
    }
}

出于安全考虑,我将代码的第四行更改为:

FileOutputStream fos = new FileOutputStream("f://serial.ser");

然后它显示了异常java.io.NotSerializableException: java.io.ByteArrayInputStream

如何序列化对象?

2 个答案:

答案 0 :(得分:1)

此情况下的序列化操作失败,因为正如Ted Hopp在上面的注释中所述,您尝试序列化的类包含非瞬态(且不可序列化)的ByteArrayInputStream对象。要解决此问题并使Registration_BE类可序列化,您可以将此字段标记为瞬态:

class Registration_BE {
  // rest of class

  private transient ByteArrayInputStream bais = null;

  // rest of class
}

这将导致它从Registration_BE的序列化过程中被省略,但是当对象在另一端反序列化时也会导致它未初始化。

如果您希望在反序列化后初始化ByteArrayInputStream,您可能需要考虑为Registration_BE类编写自定义 writeObject / readObject 方法。 Google上提供了许多关于自定义序列化的教程。此主题中的信息可能有助于您入门:

Uses of readObject/writeObject in Serialization

答案 1 :(得分:0)

如果您尝试访问操作系统(OS)分区中的文件,它将提供访问被拒绝错误。