什么是序列化
用一个 字节 序列可以表示一个对象,该 字节 序列包含该 对象的数据,对象的 类型 和 对象中存储的属性 等信息
字节 序列写出到文件之后,相当于文件中持久保存了一个对象的信息
字节 序列还可以从文件中读取回来,重构对象,对它进行 反序列化
对象的数据、 对象的类型 和 对象中 存储的数据 信息,都可以用来在内存中创建对象
序列化条件
该类必须 实现 java.io.Serializable
接口
Serializable 是一个 标记接口,不实现此接口的类将 不会使任 何状态 序列化或反序列化,会抛出 NotSerializableException
该 类 的所有属性必须是 可序列化 的。如果有一个属性不需要可序列化的,则该属性必须注明是 瞬态
的,使用 transient
关键字修饰
ObjectOutputStream类
作用
将 Java 对象的原始数据类型写出到文件,实现对象的持久存储
构造方法
public ObjectOutputStream(OutputStream out) :创建一个指定 OutputStream 的 ObjectOutputStream。 构造举例
写出对象方法
public final void writeObject (Object obj)
- 创建 Person 类
public class Person implements Serializable { public String name; public String age; public transient String address; public void show() { System.out.println("myName is " + name); } }
- 写到文件当中
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()
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 异常