序列化与反序列化流程

序列化与反序列化

序列化利用ObjectOutputStream将内存的对象写入硬盘中

反序列化利用ObjectInputStream将硬盘的对象读到内存中
可序列化的类必须实现Serializable接口
接口源码:
public interface Serializable {
}

可见接口中并没有任何抽象方法,所以它是一个标识性接口。
在可序列化的类中,应该尽量手动定义SerialVersionUID
如果没有定义,jvm在运行的过程中会自动给这个类分配一个SerialVersionUID
但是这样的话,每当你改动这个类,这个类未改动之前的已经序列化好的对象就会无法反序列化出来
因为改动过这个类,jvm给这个类从新分配了一个SerialVersionUID,以前序列化好的对象凭借之前旧的SerialVersionUID
无法识别当前的类,所以会报错,无法反序列化出来
所以类中还是应该自己定义一个SerialVersionUID

实例

package com.mytest.ObjectIO;

import java.io.*;

public class ObjectOutputStreamTest {
          
   
    public static void main(String[] args) {
          
   
        User user = new User(18,"zhangsan");
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        try {
          
                                                     //确定文件源,打开输入输出流
            oos = new ObjectOutputStream(new FileOutputStream("D:\java_test\src\com\mytest\User01"));
            ois = new ObjectInputStream(new FileInputStream("D:\java_test\src\com\mytest\User01"));  
            oos.writeObject(user);                             //序列化
            try {
          
   
                User object = (User)ois.readObject();          //反序列化
                System.out.println(object.name);
            } catch (ClassNotFoundException e) {
          
   
                e.printStackTrace();
            }

            oos.flush();
        } catch (IOException e) {
          
   
            e.printStackTrace();
        }finally {
          
   
            try {
          
   
                oos.close();                                   //关闭流
            } catch (IOException e) {
          
   
                e.printStackTrace();
            }
        }
    }
}

//定义可序列化的类
class User implements Serializable {
          
   
    private static final long serialVersionUID = 1L;
    int age;
    String name;

    public User(int age,String name) {
          
   
        this.age = age;
        this.name = name;
    }

    public int getAge() {
          
   
        return age;
    }

    public void setAge(int age) {
          
   
        this.age = age;
    }

    public String getName() {
          
   
        return name;
    }

    public void setName(String name) {
          
   
        this.name = name;
    }
}
经验分享 程序员 微信小程序 职场和发展