1. 程式人生 > 其它 >Java的序列化流和反序列化流

Java的序列化流和反序列化流

Java的序列化流和反序列化流

序列化:利用ObjectOutputStream,把物件的資訊,按照固定的格式轉成一串位元組值輸出並持久儲存到磁碟
反序列化:利用ObjectInputStream,讀取磁碟中之前序列化好的資料,重新恢復成物件

package com.cnblogs;

import java.io.*;

/*
本類用於測試序列化和反序列化
 */
/*
序列化:是指把程式中的Java物件,永久儲存到磁碟中,相當於寫出的過程對應流的方向:out,對應的序列化流為:
ObjectOutputStream
反序列化:是指把之前已經序列化的在檔案中儲存的資料,讀取/恢復到程式對應流的方向:in,對應的反序列化流為:
ObjectInputStream
 */
public class TestSerializable {
    public static void main(String[] args) {
        method();//序列化
        method2();//反序列化
    }

    private static void method() {
        ObjectOutputStream out = null;
        try {
            out = new ObjectOutputStream(new FileOutputStream("E:\\ready\\1.txt"));
            System.out.println("序列化成功!!!");
            Student student = new Student("柒",21,"泰州",'男');
            out.writeObject(student);//傳入物件
        } catch (IOException e) {
            System.out.println("很抱歉,序列化失敗!!!");
            e.printStackTrace();
        } finally {
            try {
                out.flush();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void method2() {
        ObjectInputStream in = null;
        try {
            in = new ObjectInputStream(new FileInputStream("E:\\ready\\1.txt"));
            Object o = in.readObject();
            System.out.println(o);
            System.out.println("反序列化成功!!!");
        } catch (Exception e) {
            System.out.println("反序列化失敗!!!");
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

package com.cnblogs;

import java.io.Serializable;

/*
本類用於封裝學生類
 */
/*
如果本類想完成序列化,必須實現可序列化介面,否則會報錯:
NotSerializableException: cn.tedu.serializable.Student
Serializable介面是一個空介面,裡面一個方法都沒有,
作用用來標記,標記這個類物件可以被序列化輸出
 */
public class Student implements Serializable{
//    private static final long serialVersionUID = 1l;  手動寫的UID
    private String name;//姓名
    private int age;//年齡
    private String addr;//住址
    private char gender;//性別

    public Student() {
        System.out.println("我是student類的無參構造");
    }

    public Student(String name, int age, String addr, char gender) {
        System.out.println("我是student類的全參構造");
        this.name = name;
        this.age = age;
        this.addr = addr;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    //重寫toString方法

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", addr='" + addr + '\'' +
                ", gender=" + gender +
                '}';
    }
}