52.IO流-对象的序列化

来源:互联网 发布:2017年十大网络用语 编辑:程序博客网 时间:2024/06/05 03:58

------- android培训、java培训、期待与您交流! ----------

    一、概念

  • 将堆中的对象保存到介质(如硬盘)中叫对象持久化或序列化。静态区的不行。
  • 操作对象:
    • ObjectInputStream
    • ObjectOutputStream
    • 被操作的对象需要实现Serializable(标记接口:没方法的接口)。
    二、对象
  • ObjectOutStream

    • ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。 
  • ObjectInputStream
    • ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
    三、代码
  • /*对象的序列化:ObjectOutputStream把源(如内存)中的对象序列化到目的(如硬盘)上,ObjectInputStream把源(如硬盘)中的序列化对象读取到目的(如内存)中。ObjectOutputStream序列化时,会给这个对象加一个序列化UID,当ObjectInputStream 方法readObject();会匹配这个类的UID和序列化UID,transient 关键字可以保证成员不被序列化。*/import java.io.*;class  ObjectStreamDemo{public static void main(String[] args) throws Exception{//writeObj();readObj();}public static void readObj() throws Exception{ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));Person p = (Person) ois .readObject();System.out.println(p);ois.close();}public static void writeObj() throws Exception{ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));oos.writeObject(new Person("lisi0",399));oos.close();}}

  • 注意16行,
    • 一是会报类型不匹配异常,因为文件中的序列号对象不一定是定义的对象。
    • 二是person对象成员代码改变的时候,编译时本地类会与流中的类进行比较,序列化号会不同导致InvalibClassException编译不通过。因为序列号是根据成员获取出的。
    • 怎么解决改成员改变还可以使用,可以自己定义UID,
  • 注意:静态是不能被序列化的。
  • 注意:transient修饰的成员不能被序列号。
  • 如果ObjectOutStream Write了多个  对象,那么 ObjectInputStream的read会依次读出。