java序列化

在java中序列化對象須要實現一個接口,表示該對象能夠被序列化java

java.io.Serializable

接下來介紹一個關鍵字json

transient

這個關鍵字的意思就是取反:ide

若是一個對象實現了Serializable接口,加上這個關鍵字表示這個對象不能被序列化;this

若是一個對象沒有實現Serializable接口,加上這個關鍵字表示這個對象能夠被序列化,同時須要告訴虛擬機應該如何序列化,在類的內部寫兩個方法。code

// 注:這些方法定義時必須是私有的,由於不須要你顯示調用,序列化機制會自動調用的
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
private void writeObject(ObjectOutputStream out) throws IOException;

栗子:對象

完整栗子:token

package top.swimmer.tokenizer;

import java.time.LocalDateTime;

public class Foo {
    private String a;
    private LocalDateTime time;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public LocalDateTime getTime() {
        return time;
    }

    public void setTime(LocalDateTime time) {
        this.time = time;
    }

    public Foo() {
        a = "Hello world!";
        time = LocalDateTime.now();
    }
}
package top.swimmer.tokenizer;

import java.io.Closeable;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.time.LocalDateTime;

public class Too implements Serializable, Closeable {
    private transient Foo foo; // Foo沒有實現Serializable接口,可是加了transient關鍵字就能夠被序列化了
    private String c;

    public Too() {
        c = "Good man!";
        foo = new Foo();
    }

    @Override
    public void close() throws IOException {
        System.out.println("too close");
    }

    // 要寫兩個方法供虛擬機調用,分別告訴虛擬機對於Foo對象如何寫,如何讀
    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeObject(foo.getA());
        out.writeObject(foo.getTime());
    }

    private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException {
        input.defaultReadObject();
        Foo foo = new Foo();
        foo.setA((String) input.readObject());
        foo.setTime((LocalDateTime) input.readObject());
        this.foo = foo;
    }
}
package top.swimmer.tokenizer;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectDemo {
    public static void main(String[] args) throws Exception {
        Too t = new Too();
        File file = new File(ObjectDemo.class.getResource("/aaa.json").getFile());

        ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(file));
        output.writeObject(t);
        ObjectInputStream input = new ObjectInputStream(new FileInputStream(file));
        Too t1 = (Too) input.readObject();
        System.out.println();
    }
}
相關文章
相關標籤/搜索