1、序列化java
java序列化的過程是把對象轉換爲字節序列的過程網絡
序列化的兩種用途:ide
1)把對象的字節序列永久保存大搜硬盤上,一般存放到一個文件中this
2)在網絡上傳送對象的字節序列spa
jdk中的序列化API:code
java.io.ObjectOutputStream :表示對象輸出流,他的writeObject(Object obj)方法可對參數制定的ibj對象進行序列化,把獲得的字節序列寫到一個目標輸出流中。對象
java.io.ObjectInputStream :表示對象輸入流,他的readObject()方法從一個源輸入流中讀取字節序列,再把他們反序列化爲一個對象,並將其返回。blog
只有實現了Serializable和Externalizable接口的類的對象才能被序列化。Externalizable接口繼承自Serializable接口,實現Externalizable接口的類徹底由自身來控制序列化的行爲,而實現了Serializable接口的類能夠採用默認的序列化方式。繼承
2、對象序列化的步驟:接口
一、建立一個對象輸出流,它能夠包裝一個其餘類型的源輸入流,如文件輸入流(IO流 裝飾者模式)
二、經過對象輸出流的writeObject()方法寫對象
對象反序列化額步驟:
一、新建立一個對象輸入流,它能夠包裝一個其餘類型的源輸入流,如文件輸入流
二、經過對象輸入流的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 對象輸出流,將Person對象存儲到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 complete Person{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 complete Person{age=15, name='xiaoming', sex='nan', ext='null'} deserialize complete
3、serialVersionUUID的做用
serialVersionUUID:序列化版本號,凡是實現Serializable接口的類都有一個表示序列化版本表示的靜態變量(沒有自動生成 也沒有警告)
將Person序列化後再爲Person類添加一個屬性,再進行反序列化 反序列化失敗