標籤:欄位 sys nal 賦值 str uuid system 自身 模式
一、序列化
java序列化的過程是把對象轉換為位元組序列的過程
序列化的兩種用途:
1)把對象的位元組序列永久儲存大搜硬碟上,通常存放到一個檔案中
2)在網路上傳送對象的位元組序列
jdk中的序列化API:
java.io.ObjectOutputStream :表示對象輸出資料流,他的writeObject(Object obj)方法可對參數制定的ibj對象進行序列化,把得到的位元組序列寫到一個目標輸出資料流中。
java.io.ObjectInputStream :表示對象輸入資料流,他的readObject()方法從一個源輸入資料流中讀取位元組序列,再把他們還原序列化為一個對象,並將其返回。
只有實現了Serializable和Externalizable介面的類的對象才能被序列化。Externalizable介面繼承自Serializable介面,實現Externalizable介面的類完全由自身來控制序列化的行為,而實現了Serializable介面的類可以採用預設的序列化方式。
二、對象序列化的步驟:
1、建立一個對象輸出資料流,它可以封裝一個其他類型的源輸入資料流,如檔案輸入資料流(IO流 裝飾者模式)
2、通過對象輸出資料流的writeObject()方法寫對象
對象還原序列化額步驟:
1、新建立一個對象輸入資料流,它可以封裝一個其他類型的源輸入資料流,如檔案輸入資料流
2、通過對象輸入資料流的readObject()方法讀取對象
程式碼範例:
Person.java
public class Person implements Serializable { private int age; private String name; private String sex; @Override public String toString() { return "Person{" + "age=" + age + ", name=‘" + name + ‘\‘‘ + ", sex=‘" + sex + ‘\‘‘ + ‘}‘; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Person(int age, String name, String sex) { this.age = age; this.name = name; this.sex = sex; }}
序列化和還原序列化person對象 序列化後的Person.txt檔案中亂碼 因為序列化的過程是將對象變成二進位儲存的
public static void SerializePerson() throws IOException { Person person=new Person(15,"xiaoming","nan"); //ObjectOutputStream 對象輸出資料流,將PersonObject Storage Service到Person.txt檔案,完成對Person對象的序列化 ObjectOutputStream oo=new ObjectOutputStream(new FileOutputStream(new File("classpath:Person.txt"))); oo.writeObject(person); System.out.println("serialize complete"); oo.close(); }
還原序列化的過程:
public static void Deserialize() throws IOException, ClassNotFoundException { ObjectInputStream ois=new ObjectInputStream(new FileInputStream("classpath:Person.txt")); Person person = (Person) ois.readObject(); System.out.println(person.toString()); System.out.println("deserialize complete"); ois.close(); }
運行兩個過程:
serialize completePerson{age=15, name=‘xiaoming‘, sex=‘nan‘}deserialize complete
忽然想起了transient關鍵字:做了個小改動
為Person類添加一個transient修飾的ext欄位 建立person對象時為ext賦值 進行序列化,並且還原序列化
public class Person implements Serializable { private int age; private String name; private String sex; private transient String ext;
序列化的person.txt檔案中沒有ext 還原序列化的person對象的ext為null
serialize completePerson{age=15, name=‘xiaoming‘, sex=‘nan‘, ext=‘null‘}deserialize complete
三、serialVersionUUID的作用
serialVersionUUID:序列化版本號碼,凡是實現Serializable介面的類都有一個表示序列化版本表示的靜態變數(沒有自動產生 也沒有警告)
將Person序列化後再為Person類添加一個屬性,再進行還原序列化 還原序列化失敗
java--序列化和還原序列化