ObjectOutputStream 类

  <1>  基本概念

        1.  java.io.ObjectOutputStream类:用于将一个对象的所有内容整体写入到输出流中

        2.  只能将支持 java.io.Serializable 接口的对象写入流中

        3.  类通过实现 java.io.Serializable 接口以启用其序列化功能

        4.  所谓序列化,指将一个对象需要储存的相关信息,有效组织成字节序列的转化过程

  <2>  常用的方法

        方法声明                          功能介绍

        ObjectOutputStream(OutputStream out)             根据参数指定的引用来构造对象

        void writeObject(Object obj)                   用于将参数指定的对象整体,写入到输出流中

        void close()                         用于关闭输出流,并释放有关的资源

  <3>  代码示例

      class ObjectOutputStreamTest {

        main(){

          ObjectOutputStream oos = null;

          try{

            //  1.  创建ObjectOutputStream类型的对象,与d:/a.txt文件关联

            oos = new ObjectOutputStream (new FileOutputStream("d:/a.txt"));

            //  2.  准备一个User类型的对象,并初始化

            User user = new User("qidian", "123456", "13511258688");

            //  3.  将整个User类型的对象写入输出流

            oos.writeObject(user);

            println("写入对象成功!");

          }catch (IOException e) {

            e.printStackTrace();
          } finally {
            // 4.关闭流对象并释放有关的资源
            if (null != oos) {
              try {
                oos.close();
              } catch (IOException e) {
                e.printStackTrace();
              }
            }
          }

        }

      }

// User.java
public class User implements java.io.Serializable {
    private static final long serialVersionUID = -5814716593800822421L;

    private String userName;  // 用户名
    private String password;  // 密码
    private transient String phoneNum;  // 手机号  表示该成员变量不参与序列化操作

    public User() {
    }

    public User(String userName, String password, String phoneNum) {
        this.userName = userName;
        this.password = password;
        this.phoneNum = phoneNum;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", phoneNum='" + phoneNum + '\'' +
                '}';
    }
}

 

 

ObjectInputStream 类

  <1>  基本概念

        java.io.ObjectInputStream类:用于从输入流中,一次性将对象整体读取出来。

        所谓反序列化,指将有效组织的字节序列,恢复为一个对象,及相关信息的转化过程

  <2>  常用的方法

        方法声明                          功能介绍

        ObjectInputStream(InputStream in)                根据参数指定的引用来构造对象

        Object readObject()                      从输入流中,读取一个对象,并返回,无法通过返回值来判断是否读取到文件的末尾

        void close()                           用于关闭输入流,并释放有关的资源

  <3>  版本化序列号

        序列化机制,是通过在运行时判断类的 serialVersionUID 来验证版本一致性的。 在进行反序列化时,JVM会把传来的字节流中的 serialVersionUID 与

        本地相应实体类的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常

        (InvalidCastException)。

  <4>  transient 关键字

        transient 是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。

        当一个对象被串行化的时候,transient 型变量的值不包括在串行化的表示中,然而非 transient 型的变量是被包括进去的。

  <5>  经验

        当希望将多个对象写入文件时,通常将多个对象放入一个集合中,然后将集合这个整体,看作一个对象,写入输出流中,

        此时只需要调用一次 readObject方法,就可以将整个集合的数据读取出来,从而避免了通过返回值,进行是否到达文件末尾的判断。

   <6>  代码示例

      class ObjectInputStreamTest {

        main(){

          ObjectInputStream ois = null;

          try{

            // 1. 创建ObjectInputStream类型的对象,与d:/a.txt文件关联

            ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));

            // 2. 从输入流中,读取一个对象,并打印

            Object obj = ois.readObject();

            println("读取到的对象是:"  + obj);  // qidian 123456 13511258688  null

          }catch (IOException e) {

            e.printStackTrace();
          } catch (ClassNotFoundException e) {
            e.printStackTrace();
          } finally {
            // 3.关闭流对象并释放有关的资源
            if (null != ois) {
              try {
                ois.close();
              } catch (IOException e) {
                e.printStackTrace();
              }
            }
          }

        }

      }