Java序列化(Serialize)和反序列化(Deserialize)

对象的序列化

一、目的:
将对象转换成与平台无关的二进制流,从而可以保存到磁盘或者进行网络传输,其它程序获 得这个二进制流后可以将其还原成对象。
序列化机制可以使对象可以脱离程序的运行而对立存在。
————————————————————————————————————————
二、是什么?
序列化(Serialize)指将一个java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该java对象。

————————————————————————————————————————
三、如何实现对象的序列化

要实现对象的序列化,必须让它的类实现序列化,可以通过实现Serializable接口。   

特别:1) Serializable接口中并没有需要实现的方法,它的作用仅仅是一个标记,表示实现            它的类是可序列化的。诸如像Serializable这种没有方法的接口,我们一般称之为             标记接口。
     2)一定要添加序列化版本号(serialVersionUID)
     3)一个类中可能有很多的成员变量,有些我不想进行序列化。请问该怎么办呢?
   使用transient关键字声明不需要序列化的成员变量

————————————————————————————————————————
四、将对象写入文件

1)创建对象输出流对象
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
2)创建可序列化类的对象
   Student s = new Student("张三",15);
3) 将对象写入文件 
  oos.writeObject(s);
4)关闭资源
   oos.close();

应该注意的问题:
* ObjectOutputStream 的构造方法,需要借助一个字节输出流,并可能存在IOException。

           public ObjectOutputStream(OutputStream out)throws IOException

 * 在执行oos.writeObject(s)时,可能抛出以下异常:
      ** InvalidClassException  
         可能的原因: 
          <*>该类的序列版本号与从流中读取的类描述符的版本号不匹配 
          <*>该类包含未知数据类型 
          <*>该类没有可访问的无参数构造方法 
      ** NotSerializableException   类未实现Serializable接口
      ** IOException 

———————————————————————————————————————
五、文件中读取数据,并转换对象

        // 创建反序列化对象
      ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
        // 还原对象
        Object obj = ois.readObject();
        // 释放资源
        ois.close();
                // 输出对象
        System.out.println(obj);

应该注意的问题:

   * 在执行ois.readObject();的时候可能抛出IOException, ClassNotFoundException

   * 得到的obj不需要强转为Student就可以直接输出。

你可能感兴趣的:(java)