ObjectOutputStream 类

  1、概述

    java.io.ObjectOutputStream extends OutputStream

    ObjectOutputStream:对象的序列化流,作用:把对象转成字节数据的输出到文件中保存,对象的输出过程称为序列化,可实现对象的持久存储。

  2、构造方法

ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。

    参数:OutputStream out:字节输出流

  3、特有的成员方法

void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。

    writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。

  可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。

  4、使用步骤

    ① 创建ObjectOutputStream对象,构造方法中传递字节输出流

    ② 使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中

    ③ 释放资源

  5、序列化操作

    一个对象要想序列化,必须满足两个条件

      ① 该类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException

       每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。 

      ② 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

  Demo:

 1 public class Person implements Serializable{             // 实现序列化接口
 2     private static final long serialVersionUID = 1L;
 3     private String name;
 4     private int age;
 5 
 6     public Person() {
 7     }
 8 
 9     public Person(String name, int age) {
10         this.name = name;
11         this.age = age;
12     }
13 
14     @Override
15     public String toString() {
16         return "Person{" +
17                 "name='" + name + '\'' +
18                 ", age=" + age +
19                 '}';
20     }
21 
22     public String getName() {
23         return name;
24     }
25 
26     public void setName(String name) {
27         this.name = name;
28     }
29 
30     public int getAge() {
31         return age;
32     }
33 
34     public void setAge(int age) {
35         this.age = age;
36     }
37 }
38 public static void main(String[] args) throws IOException {
39         //1.创建ObjectOutputStream对象,构造方法中传递字节输出流
40         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\person.txt"));
41         //2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中
42         oos.writeObject(new Person("张三",18));
43         //3.释放资源
44         oos.close();
45     }

 

  注意

    ① 序列化和反序列化的时候,会抛出NotSerializableException不能序列化异常

    ② 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

    ③ Serializable接口也叫标记型接口,要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记

    ④ 当进行序列化时会检查是否有这个标记,有:就可以序列化和反序列化;没有:就会抛出 NotSerializableException异常

  Static 关键字:静态关键字

    静态优先于非静态加载到内存中(静态优先于对象进入到内存中)

    被static修饰的成员变量不能被序列化的,因为静态的变量不属于某个对象,而是整个类的,所以不需要随着对象的序列化而序列化。序列化的都是对象

    如果上面的 Person类中的 age 声明为:private static int age;这时再对 Person 这个对象序列化时,age 始终为0,不能被序列化。    

  transient 关键字:瞬态关键字

    被transient修饰成员变量,不能被序列化

    Demo:

1  private transient int age;
2  oos.writeObject(new Person("张三",18));
3  Object o = ois.readObject();
4  Person{name='张三', age=0}

 

    注意:

    序列化一个对象时,要求它的属性要么是基本数据类型,如果是引用数据类型,这个引用数据类型也必须实现Serializable接口。

    序列化一个数组,要求元素类型实现Serializable接口。 

 

posted on 2019-09-10 18:24  格物致知_Tony  阅读(17021)  评论(0编辑  收藏  举报