序列化是什麼:把一個java對象轉化爲二進制對象,並保存到硬盤,或在網絡上傳輸。反序列化就是把序列化的二進制對象讀到內存中。 做用:
一、減小內存佔用或網絡傳輸。好比web容器中的session,當session數量過大好比10W+鏈接時會將一部分session序列化到硬盤,須要時再讀取。
二、當兩個遠程進程通訊,能夠將對象序列化後傳給另外的進程,另外的進程再反序列化獲取對象值。
代碼示例:
Person類 實現 Serializable 接口 `package com.seriable;html
import java.io.Serializable;java
/**git
Desc:github
@author: lisha 2018/7/25 14:29 */ public class Person implements Serializable {web
/**數組
public int getAge() { return age; }網絡
public String getName() { return name; }session
public String getSex() { return sex; }jvm
public void setAge(int age) { this.age = age; }測試
public void setName(String name) { this.name = name; }
public void setSex(String sex) { this.sex = sex; } }`
測試類測試序列化
`public class MainTest {
public static void main(String[] args) throws Exception { // 序列化Person對象 SerializePerson(); // 反序列Perons對象
// Person p = DeserializePerson(); // System.out.println(MessageFormat.format("name={0},age={1},sex={2}", // p.getName(), p.getAge(), p.getSex())); }
/** * MethodName: SerializePerson * Description: 序列化Person對象 * [@author](https://my.oschina.net/arthor) xudp * [@throws](https://my.oschina.net/throws) FileNotFoundException * [@throws](https://my.oschina.net/throws) IOException */ private static void SerializePerson() throws FileNotFoundException, IOException { Person person = new Person(); person.setName("ls"); person.setAge(28); person.setSex("男"); // ObjectOutputStream 對象輸出流,將Person對象存儲到E盤的Person.txt文件中,完成對Person對象的序列化操做 ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream( new File("E:/Person.txt"))); oo.writeObject(person); System.out.println("Person對象序列化成功!"); oo.close(); } /** * MethodName: DeserializePerson * Description: 反序列Perons對象 * [@author](https://my.oschina.net/arthor) xudp * @return * @throws Exception * @throws IOException */ private static Person DeserializePerson() throws Exception, IOException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream( new File("E:/Person.txt"))); Person person = (Person) ois.readObject(); System.out.println("Person對象反序列化成功!"); return person; }
}`
生成txt文件
反序列化是同樣的,將txt文件讀到java對象中 serialVersionUID 這個在Person中是序列化id,用來匹配校驗序列化的對象和反序列化生成的對象必須是同一個對象。 /** * 序列化ID */ //private static final long serialVersionUID = -5809782578272943999L;
JDK自帶的序列化有哪些缺點呢?
效率很低,JDK提供的序列化技術相對而已效率較低。在轉換二進制數組過程當中空間利用率較差。 參考網址https://blog.csdn.net/canot/article/details/53750443
github上序列化效率對比,都是英文的,https://github.com/eishay/jvm-serializers/wiki
本文參考網址
http://www.javashuo.com/article/p-zwszwxvq-ds.html
JDK自帶序列化注意事項
一、若是子類實現Serializable接口而父類未實現時,父類不會被序列化,但此時父類必須有個無參構造方法,不然會拋InvalidClassException異常。
二、靜態變量不會被序列化,那是類的「菜」,不是對象的。
三、transient關鍵字修飾變量能夠限制序列化。
四、虛擬機是否容許反序列化,不只取決於類路徑和功能代碼是否一致,一個很是重要的一點是兩個類的序列化 ID 是否一致,就是 private static final long serialVersionUID = 1L。
五、Java 序列化機制爲了節省磁盤空間,具備特定的存儲規則,當寫入文件的爲同一對象時,並不會再將對象的內容進行存儲,而只是再次存儲一份引用。反序列化時,恢復引用關係。
六、序列化到同一個文件時,如第二次修改了相同對象屬性值再次保存時候,虛擬機根據引用關係知道已經有一個相同對象已經寫入文件,所以只保存第二次寫的引用,因此讀取時,都是第一次保存的對象。讀者在使用一個文件屢次 writeObject 須要特別注意這個問題(基於第5點)。
參考網址:https://blog.csdn.net/chenleixing/article/details/43833805