您好,登錄后才能下訂單哦!
這篇“Java序列化與反序列化怎么應用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java序列化與反序列化怎么應用”文章吧。
Java序列化把一個對象Java Object
變為一個二進制字節序列byte[]
Java反序列化就是把一個二進制字節序列byte[]
變為Java對象Java Object
字節輸出流對象,將對象的輸出流寫到文件中(結合FileOutputStream使用)
實例:
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt")); 或 FileOutputStream fout = new FileOutputStream("1.txt"); ObjectOutputStream out = new ObjectOutputStream(fout);
此外ObjectOutputStream還提供了writeObject()
方法來序列化一個對象,并將它發送到輸出流。
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt")); out.writeObject(new Test("Sentiment",10)); //對Test類中的構造方法進行傳參
字節輸入流對象,將文件中的二進制字節序列進行反序列化操作(結合FileInputStream)
實例:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("1.txt")); 或 FileInputStream fin = new FileInputStream("1.txt"); ObjectInputStream oin = new ObjectInputStream(fin);
此外ObjectInputStream還提供readObject()
方法從流中取出下一個對象,并將對象反序列化。它的返回值為Object,因此,需要將它轉換成合適的數據類型。
ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt")); Test o = (Test)In.readObject(); System.out.println(o); //讀取后輸出實例理解
實例理解
Test.java(類想要進行序列化操作,必須實現Serializable接口繼承)
package Sentiment.unserialize.demo01; import java.io.Serializable; public class Test implements Serializable { private String name; private int age; public Test() { } public Test(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Test{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
Serializable.java
package Sentiment.unserialize.demo01; import java.io.*; public class Serializable { public static void main(String[] args) throws IOException { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt")); out.writeObject(new Test("Sentiment",10)); out.close(); } }
UnSerializable.java
package Sentiment.unserialize.demo01; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class UnSerializable { public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt")); Test o = (Test)In.readObject(); System.out.println(o); } }
運行Serializable.java后便得到二進制字節碼文件內容
此時在運行UnSerializable.java便得到了二進制字節碼反序列化后的內容
每個可序列化的類在序列化時都會關聯一個版本號 , 這個版本號就是 serialVersionUID 屬性
serialVersionUID 屬性必須通過 static final long 修飾符來修飾 。
如果可序列化的類未聲明 serialVersionUID 屬性 , 則 Java 序列化時會根據類的各種信息來計算默認的 serialVersionUID 值 . 但是 Oracle 官方文檔強烈建議所有可序列化的類都顯示聲明 serialVersionUID 值 .
實例理解
在Test.java中定義serialVersionUID
其值為1
package Sentiment.unserialize.demo01; import java.io.Serializable; public class Test implements Serializable { public static final long serialVersionUID = 1L; //定義serialVersionUID private String name; private int age; public Test() { } public Test(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Test{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
此時運行Serializable.java進行序列化操作
運行完畢后將serialVersionUID
的值定義為2—>public static final long serialVersionUID = 2L;,在運行UnSerializable.java會報錯
Transient( 瞬態變量 )是一個 Java 關鍵詞 , 它用于標記類的成員變量在持久化到字節流時不要被序列化 ; 在通過網絡套接字流傳輸字節流時 , transient 關鍵詞標記的成員變量不會被序列化 。此為被static修飾的靜態變量也不參與序列化操作。
將Test.java中的name
和age
變量前分別加上transient
和static
package Sentiment.unserialize.demo01; import java.io.Serializable; public class Test implements Serializable { public static final long serialVersionUID = 1L; //定義serialVersionUID private transient String name; //加上transient private static int age; //加上static public Test() { } public Test(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Test{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
此時在執行Serializable.java和UnSerializable.java,輸出結果:Sentiment—>null,10—>0
官方允許用戶在被序列化的類中重寫 readObject() 方法 , 重寫后的方法將負責在反序列化時重構當前類對象 . 用戶只需要在重寫的 readObject() 方法中實現 defaultReadObject() 方法 , 就可以確保反序列化過程正常執行 .
實現 defaultReadObject() 方法調用,并在Test類中重寫該方法,在進行序列化和反序列化操作即可執行命令
private void readObject(java.io.ObjectInputStream a) throws IOException, ClassNotFoundException{ a.defaultReadObject(); Runtime.getRuntime().exec("calc.exe"); }
以上就是關于“Java序列化與反序列化怎么應用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。