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