一、前言
- 本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和ObjectOutputStream。
二、关键字
2.1 Serializable
2.1.1
作用:
- 如果你希望类能够序列化和反序列化,必须实现Serializable接口,Java Serializable接口(java.io.Serializable是类如果要序列化和反序列化的话必须实现的标记接口。
- Java对象序列化(写入)是使用ObjectOutputStream和反序列化(读取)是通过ObjectInputStream.
2.1.2
意义:
- Serializable是一个标记接口,意味着它不包含任何方法。因此,一个类实现Serializable不需要实现任何特定的方法。一个类实现Serializable接口是告诉Java这个类是用于对象序列化的。
2.1.3
demo:
import java.io.Serializable;
public static class Person implements Serializable {
public String name = null;
public int age = 0;
public transient double salary = 130000; //transient短暂的,表示该变量不序列化
}
2.2 ObjectInputStream
2.2.1
作用:
- ObjectInputStream能够让你从输入流中读取Java对象,
2.2.2
意义:
- 读取文件中的对象时,不需每次读取一个字节。你可以把InputStream包装到ObjectInputStream中,然后就可以从中读取对象了。
2.2.3
demo:
ObjectInputStream input =
new ObjectInputStream(new
BufferedInputStream(new (FileInputStream("object.data")));
MyClass object = (MyClass) input.readObject(); //etc.
input.close();
- 注:你读取的对象必须是MyClass的一个实例,并且必须事先通过ObjectOutputStream序列化到"object.data"文件中
2.3 ObjectOutputStream
2.3.1
作用:
- ObjectOutputStream能够让你把对象写入到输出流中
2.3.2
意义:
- 若要把对象写入(序列化)到输出流中,而不需要每次写入一个字节。你可以把OutputStream包装到ObjectOutputStream中,然后就可以把对象写入到该输出流中了
2.3.3
demo:
OutputStream output = new FileOutputStream("data/data.bin");
try (ObjectOutputStream oos =
new ObjectOutputStream(output)) { //java7_try with resource
Person person = new Person();
person.name = "Call me Shonan!";
person.age = 18;
oos.writeObject(person);
}
-
注:
- (1)、第一个FileOutputStream实例不是在try-with-resources块中创建的。这意味着,try-with-resources块将不会自动关闭这个文件输出流实例。但是,当ObjectOutputStream被关闭时,它也会关闭它写入的OutputStream实例,因此当oos关闭时,fileoutputstream实例将被关闭,
- (2)、在你序列化和反序列化一个对象之前,该对象的类都必须实现了java.io.Serializable接口
三、附:
-
注意
1. static属性不参与序列化。 2. 对象中的某些属性如果不想被序列化,不能使用static,而是使用transient修饰。 3. 为了防止读和写的序列化ID不一致,一般指定一个固定的序列化ID。
- 据作者得知,对象序列化本身就是一个主题,于此我们不再深入讨论有关对象序列化的更深入的细节!感兴趣的、想深入学习序列化的小伙伴可以自行深入探索!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。