Java 序列化与反序列化

时间:2022-11-13 22:58:12

(目录)

一、说明

序列化与反序列化是什么

  • 序列化:将Java对象表示为一个字节序列,存储对象数据到文件中,可用于网络传输

  • 反序列化:从文件中读取序列化对象,对它进行反序列化,恢复成Java对象

二、理解

序列化过程

  • 整个过程是JVM独立的,序列化的对象可以在不同的平台上反序列化该对象
  • 对象序列化,类必须实现Serializable接口
  • 该类的所有属性必须是可序列化的,如果有一个属性不是可序列化的,则该属性必须注明是短暂的
  • 使用IO流中的对象流实现序列化操作,将对象保存到文件,再读取出来
  • 当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名

序列化作用

  • 对象转化为二进制,可用于网络传输
  • 把内存中的对象保存到一个文件中或者数据库中

三、实现

1.实现接口

创建一个Student类,实现Serializable接口

public  class Student implements java.io.Serializable {
    public String name;
    public String classes;
    public transient int SSN;
    public int number;
    public void checkInfo() {
        System.out.println("Student Info " + name
                + " " + classes);
    }
}

2.序列化方法

ObjectOutputStream.writeObject()方法

			FileOutputStream fileOut = new FileOutputStream("file\\student.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(s);
            out.close();
            fileOut.close();
public class SerializeDemo {
    public static void main(String [] args){
        Student s = new Student();
        s.number = 17;
        s.name = "Good";
        s.classes = "computer_1";
        s.SSN = 233;
        try {
            FileOutputStream fileOut =
                    new FileOutputStream("file\\student.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(s);
            out.close();
            fileOut.close();
            System.out.printf("Serialized data is saved in file/student.ser");
        }catch(IOException i) {
            i.printStackTrace();
        }
    }
}

Java 序列化与反序列化

3.反序列化方法

ObjectInputStream.readObject()方法

            FileInputStream fileIn = new FileInputStream("file\\student.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            s= (Student) in.readObject();
            in.close();
            fileIn.close();
public class DeserializeDemo {
    public static void main(String [] args) {
        Student s = null;
        try {
            FileInputStream fileIn = new FileInputStream("file\\student.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            s= (Student) in.readObject();
            in.close();
            fileIn.close();
        }catch(IOException i) {
            i.printStackTrace();
            return;
        }catch(ClassNotFoundException c) {
            System.out.println("Student class not found");
            c.printStackTrace();
            return;
        }
        System.out.println("Deserialized Student");
        System.out.println("Name: " + s.name);
        System.out.println("Address: " + s.classes);
        //SSN属性是短暂的,该值没有被发送到输出流,反序列化后属性为 0
        System.out.println("SSN: " + s.SSN);
        System.out.println("Number: " + s.number);
    }
}

Java 序列化与反序列化