談Java中的序列化
甚麼是序列化?
在java程序中,若想要把當前類存起來以便以後還原使用,此實我們就可以使用java的序列化,序列化是把類拆解與組合的過程,當類要使用序列化就必須實現Serializable接口。
實現Serializable接口
若要完成序列化,只需要將該類實現serializable接口即可。
Serializable Interface
此接口為一種標示接口,該介面不提供任何的方法,標示(mark)使得編譯器知道該為我們的類實作序列化的能力。
無法正確的序列化
1. 若該類包含其他類的引用而且這個其他類並沒有實現serialzable此實會拋出NotSerializableException例外。
2. 若該類包含static成員變量時,該變量無法成功序列化,因為static變量屬於class而不是物件本身。
3. 上述第一種情況若想要排除該成員序列化我們可以在該成員前面加上關鍵字transient來告知此成員不需要參加序列化。
ObjectInputStream
ObjectOutputStream
範例
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class SerialiableTest1 { public static void main(String[] args) throws Exception { Person p1 = new Person(20,"123",4.5); Person p2 = new Person(30,"234",4.4); Person p3 = new Person(40,"345",4.6); FileOutputStream fs = new FileOutputStream("person.txt"); ObjectOutputStream oos = new ObjectOutputStream(fs); oos.writeObject(p1); oos.writeObject(p2); oos.writeObject(p3); oos.close(); FileInputStream fis = new FileInputStream("person.txt"); ObjectInputStream ois = new ObjectInputStream(fis); Person p4 = (Person)ois.readObject(); Person p5 = (Person)ois.readObject(); Person p6 = (Person)ois.readObject(); System.out.println(p4); System.out.println(p5); System.out.println(p6); } } class Person implements Serializable { int age; // 不被序列化 transient String name; double height; public Person(int age, String name, double height) { this.age = age; this.name = name; this.height = height; } @Override public String toString() { return "Person [age=" + age + ", height=" + height + ", name=" + name + "]"; } }