java对象序列化小结          返回主页

java序列化使用serializable实现序列化,主要让类实现serializable标记接口即可。无须实现任何方法。

若类实现了serializable接口,则该类对象是可序列化的

序列化该对象的方法

  1. 创建一个ObjectOutputStream

  2. 调用ObjectOutputStream的writeObject方法,输出可序列化对象

代码如下

package Serializable;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class WriteObject {

    public static void main(String[] args) {
        try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"))){
            Person per = new Person("snowalker", 19);
            //per对象写入输出流
            oos.writeObject(per);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果

有参构造函数

反序列化

  1. 创建一个ObjectInputStream输出流
  2. 调用ObjectInputStream对象的readObject方法,读取流中对象,该方法返回一个Object类型,若知道类型则可以将其强制转换为真实类型

代码如下

package Serializable;

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class ReadObject {

    public static void main(String[] args) {
        try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"))) {
            //从输入流中读取一个java对象,将其强制转换为Person对象
            Person person =(Person) ois.readObject();
            System.out.println("name: " + person.getName() + " age: " + person.getAge());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果

name: snowalker age: 19

注意点

  1. 当序列化读取java对象时,并没有调用构造器,表明反序列化机制,无须通过构造器初始化java对象;
  2. 使用反序列化机制恢复对象时,必须按照实际写入顺序读取;
  3. 若类之间存在依赖关系,则被依赖的类也必须可序列化。

java序列化算法

  1. 所有保存到磁盘中的对象都有一个序列化编号,当程序试图序列化一个对象时,程序将先检查该对象是否已经被序列化过,只有该对象从未序列化过,系统才会将其转换为字节序列并输出;
  2. 如果某个对象已经序列化过,程序只是输出一个序列化编号而非再次序列化该对象;

递归序列化

当对某个对象进行序列化时,系统会自动把该对象所有的参数依次进行序列化,如果某个参数引入了另一个对象,则被引用的对象也会被序列化,如果被引用的对象的参数,也引用了其他对象,则被引用的对象也会被序列化,这称之为递归序列化。