在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(); } }