0%

序列化

什么是序列化

用一个 字节 序列可以表示一个对象,该 字节 序列包含该 对象的数据,对象的 类型 和 对象中存储的属性 等信息

字节 序列写出到文件之后,相当于文件中持久保存了一个对象的信息

字节 序列还可以从文件中读取回来,重构对象,对它进行 反序列化

对象的数据、 对象的类型 和 对象中 存储的数据 信息,都可以用来在内存中创建对象

序列化条件

该类必须 实现 java.io.Serializable 接口

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

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

ObjectOutputStream类

作用

将 Java 对象的原始数据类型写出到文件,实现对象的持久存储

构造方法

public ObjectOutputStream(OutputStream out) :创建一个指定 OutputStream 的 ObjectOutputStream。 构造举例

写出对象方法

public final void writeObject (Object obj)

  • 创建 Person 类
1
2
3
4
5
6
7
8
9
public class Person implements Serializable {
public String name;
public String age;
public transient String address;

public void show() {
System.out.println("myName is " + name);
}
}
  • 写到文件当中
1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) throws Exception {
Person person = new Person();
person.name = "xhh";
person.age = "1";
person.address = "上海";
FileOutputStream fos = new FileOutputStream("person.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(person);
oos.close();
fos.close();
}

ObjectInputStream类

作用

ObjectInputStream 反序列化流,将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象

构造方法

public ObjectInputStream(InputStream in) :创建一个指定 InputStream 的 ObjectInputStream

读取对象方法

  • readObject()
1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) throws Exception {
FileInputStream fileIn = new FileInputStream("person.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person p = (Person) in.readObject();
System.out.println(p.name);
System.out.println(p.age);
System.out.println(p.address);
p.show();
fileIn.close();
in.close();
}

注意事项

对于 JVM 可以 反序列化 对象,它必须是能够找到 class 文件的类。

如果找不到该类的 class 文件,则抛出一个 ClassNotFoundException 异常

↓赏一个鸡腿... 要不,半个也行↓