【java基础】15.I/O:序列化

来源:互联网 发布:杭州 软件开发 编辑:程序博客网 时间:2024/05/18 03:52
•将对象转换为字节流保存起来,并在以后还原这个对象,这种机制叫做对象序列化。
•将一个对象保存到永久存储设备上称为持久化。
•一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。
 
一个类若想被序列化,则需要实现java.io.Serializable接口,该接口中没有定义任何方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个类的对象是可以序列化的。
 
序列化(serialization)是把一个对象的状态写入一个字节流的过程。当你想要把你的程序状态存到一个固定的存储区域例如文件时,它是很管用的
 
反序列化:就是把信息从文件加载到程序的过程。
 
•当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。
•如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。
在序列化时,static变量是无法序列化的;如果A包含了对B的引用,那么在序列化A的时候也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常,这时就需要将对B的引用设为transient,该关键字表示变量不会被序列化。
 
 
•Serializable接口
–只有一个实现Serializable接口的对象可以被序列化工具存储和恢复。Serializable接口没有定义任何成员。它只用来表示一个类可以被序列化。如果一个类可以序列化,它的所有子类都可以序列化。
–声明成transient的变量不被序列化工具存储。同样,static变量也不被存储
 
•ObjectOutput接口
–ObjectOutput 继承DataOutput接口并且支持对象序列化。特别注意writeObject( )方法,它被称为序列化一个对象。所有这些方法在出错情况下引发IOException 异常
 
ObjectOutputStream类
–ObjectOutputStream类继承OutputStream 类和实现ObjectOutput 接口。它负责向流写入对象
 
•ObjectInput
–ObjectInput 接口继承DataInput接口。它支持对象序列化。特别注意 readObject( )方法,它叫反序列化对象
•ObjectInputStream
–ObjectInputStream 继承InputStream 类并实现ObjectInput 接口。ObjectInputStream 负责从流中读取对象。该类的构造方法如下:
–ObjectInputStream(InputStream inStream)
throws IOException,StreamCorruptedException
 
 private void writeObject(java.io.ObjectOutputStream out) throws IOException{    out.writeInt(age);    out.writeUTF(name);    System.out.println("write object");}  private void readObject(java.io.ObjectIutputStream in) throws IOException,ClassNotFoundException{      age = in.readInt();      name = in.readUTF();    System.out.println("read object");}

当我们在一个待序列化/反序列化的类中实现了以上两个private方法(方法声明要与上面的保持完全的一致),那么就允许我们以更加底层、更加细粒度的方式控制序列化/反序列化的过程。
 
 
 
 
 
 注:此文档为学习圣思园风中叶教程结合自身学习所记录。