對象序列化

對象序列化

定義:通過使用ObjectInputStream和ObjectOutputStream類保存和對象讀取的機制叫做序列化機制

簡單說就是變成本地文件,導彈來了都不怕,硬盤不壞 數據不丟

ObjectInputStream:對象輸入流
ObjectOutputStream:對象輸出流

假如現在有一student信息項目,(代碼如下)

student.java類

public class Student {
    /**
     * 
     */
    
    //封裝
    private int stu_id;
    private String stu_name;
    private int age;
    private String school;
    //自動生成get和set方法
    public int getStu_id() {
        return stu_id;
    }
    public void setStu_id(int stu_id) {
        this.stu_id = stu_id;
    }
    public String getStu_name() {
        return stu_name;
    }
    public void setStu_name(String stu_name) {
        this.stu_name = stu_name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSchool() {
        return school;
    }
    public void setSchool(String school) {
        this.school = school;
    }
    //將地址 ----可視化的string
    @Override
    public String toString() {
        return "Student [stu_id=" + stu_id + ", stu_name=" + stu_name + ", age=" + age + ", school=" + school + "]";
    }
}

ObjcetStudy類;

public static void main(String[] args) {
       Student s =new Student();
       s.setStu_id(1000);
       s.setStu_name("張三");
       s.setAge(23);
       s.setSchool("北大");
       

為了防止執行崩潰,丟失數據,現在將它序列化

先將對象實例化,添加文件流、對象流,并將文件放在一指定磁盤中

所以修改ObjcetStudy類中代碼

public static void main(String[] args) {
        Student s =new Student();
        s.setStu_id(1000);
        s.setStu_name("張三");
        s.setAge(23);
        s.setSchool("北大");
        
        //對象實例化
        //先文件輸出流
        FileOutputStream fos=null;
        //對象輸出流
        ObjectOutputStream oos =null;
        
        //實例化低級流的對象
        try {
            fos=new FileOutputStream("E:/zhangsan.bin");//要放在本地磁盤中的路徑,自己定義
            oos= new ObjectOutputStream(fos);
            //寫出對象
            oos.writeObject(s);
            System.out.println("執行完畢");
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                oos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

修改完ObjcetStudy類此時 還無法執行 代碼,

需要在Student類中 添加Serializable 標識接口

該標識此類對象支持序列化

public class Student implements Serializable{

此時需要自動添加一ID


鼠標放置在黃線處,單擊添加 ID

此時代碼變為:
Student 類:

public class Student implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    //封裝
    private int stu_id;
    private String stu_name;
    private int age;
    private String school;
    //自動生成get和set方法
    public int getStu_id() {
        return stu_id;
    }
    public void setStu_id(int stu_id) {
        this.stu_id = stu_id;
    }
    public String getStu_name() {
        return stu_name;
    }
    public void setStu_name(String stu_name) {
        this.stu_name = stu_name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSchool() {
        return school;
    }
    public void setSchool(String school) {
        this.school = school;
    }
    //將地址 ----可視化的string
    @Override
    public String toString() {
        return "Student [stu_id=" + stu_id + ", stu_name=" + stu_name + ", age=" + age + ", school=" + school + "]";
    }
    

ObjcetStudy 類

public class ObjcetStudy {
    public static void main(String[] args) {
        Student s =new Student();
        s.setStu_id(1000);
        s.setStu_name("張三");
        s.setAge(23);
        s.setSchool("北大");
        
        //對象實例化
        //先文件輸出流
        FileOutputStream fos=null;
        //對象輸出流
        ObjectOutputStream oos =null;
        
        //實例化低級流的對象
        try {
            fos=new FileOutputStream("E:/zhangsan.bin");//要放在本地磁盤中的路徑,自己定義
            oos= new ObjectOutputStream(fos);
            //寫出對象
            oos.writeObject(s);
            System.out.println("執行完畢");
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                oos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

執行代碼,去fos=new FileOutputStream("E:/zhangsan.bin");中自己定義的文件存放路徑中查看自己的文件


反序列化

將文件讀取到java程序中

//文件輸入流
        FileInputStream fis=null;
        //對象輸入流
        ObjectInputStream ois=null;
        try {
            fis=new FileInputStream("E:/zhangsan.bin");
            ois=new ObjectInputStream(fis);
            //輸入對象
            Student ss=(Student)ois.readObject();
            System.out.println(ss);
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                ois.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

執行輸出:

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。