Java 之 ObjectOutputStream 类

ObjectOutputStream 类

  1、概述

    java.io.ObjectOutputStream extends OutputStream

    ObjectOutputStream:对象的序列化流,作用:把对象以流的方式写入到文件中保存,实现对象的持久存储。

  2、构造方法

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

    参数:OutputStream out:字节输出流

  3、特有的成员方法

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

  4、使用步骤

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

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

    ③ 释放资源

  5、序列化操作

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

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

      ② 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用
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}

     

猜你喜欢

转载自www.cnblogs.com/niujifei/p/11499074.html
今日推荐