让你的对象跑出内存,写入到磁盘或者进行网络传输,一文掌握Java对象序列化
文章目錄
- 對象序列化是什么
- 如何讓對象可序列化
- 讓對象跑出內存
對象序列化是什么
對象序列化機制允許把內存中的Java對象轉換成平臺無關的二進制流,從而允許把這種二進制流持久地保存在磁盤上,或通過網絡將這種二進制流傳輸到另一個網絡節點。當其它程序獲取了這種二進制流,就可以恢復成原來的Java對象。
序列化的好處在于可將任何實現了Serializable接口的對象轉化為字節數據,使其在保存和傳輸時可被還原。
序列化是 RMI(Remote Method Invoke – 遠程方法調用)過程的參數和返回值都必須實現的機制,而 RMI 是 JavaEE 的基礎。因此序列化機制是JavaEE 平臺的基礎。
如果讓某個對象支持序列化機制,則必須讓對象所屬的類及其屬性是可序列化的,為了讓某個類是可序列化的,該類必須實現Serializable或者Externalizable兩個接口之一。否則,會拋出NotSerializableException異常。
凡是實現Serializable接口的類都有一個表示序列化版本標識符的靜態變量:
private static final long serialVersionUID;serialVersionUID用來表明類的不同版本間的兼容性。簡言之,其目的是以序列化對象進行版本控制,有關各版本反序列化時是否兼容。如果類沒有顯示定義這個靜態常量,它的值是Java運行時環境根據類的內部細節自動生成的。若類的實例變量做了修改,serialVersionUID可能發生變化。所以建議進行顯式聲明。
簡言之,Java的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID與本地相應實體類的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常(InvalidCastException)。
如何讓對象可序列化
import java.io.Serializable;/*** @Author: Yeman* @Date: 2021-09-27-8:27* @Description:*/class pet implements Serializable { //實現Serializable接口public static final long serialVersionUID = 999794470754667999L; //顯示賦值全局變量serialVersionUIDprivate String name;public pet(String name) {this.name = name;}@Overridepublic String toString() {return "pet{" +"name='" + name + '\'' +'}';} }public class Person implements Serializable { //實現Serializable接口public static final long serialVersionUID = 6849794470754667999L; //顯示賦值全局變量serialVersionUIDprivate String name;private int age;private pet pet;public Person(String name, int age, pet pet) {this.name = name;this.age = age;this.pet = pet;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", pet=" + pet +'}';} }讓對象跑出內存
通過對象流ObjectInputStream和OjbectOutputSteam。
序列化:用ObjectOutputStream類保存基本類型數據或對象的機制,將內存中的對象寫入磁盤或者進行網絡傳輸。
反序列化:用ObjectInputStream類讀取基本類型數據或對象的機制,將磁盤或者進行網絡傳輸中的序列化對象讀過來。
ObjectOutputStream和ObjectInputStream不能序列化static和transient修飾的成員變量。
流的相關知識可以見《IO流相關知識點》。
序列化(ObjectOutputStream):
import java.io.*;/*** @Author: Yeman* @Date: 2021-09-26-20:13* @Description:*/ public class Test {public static void main(String[] args) {ObjectOutputStream oos = null;try {oos = new ObjectOutputStream(new FileOutputStream("IO\\test.txt"));oos.writeUTF(new String("你好世界!"));oos.flush();oos.writeObject(new Person("Lily",20,new pet("Xinxin")));oos.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (oos != null) oos.close();} catch (IOException e) {e.printStackTrace();}}} }反序列化(ObjectInputStream):
import java.io.*;/*** @Author: Yeman* @Date: 2021-09-26-20:13* @Description:*/ public class Test {public static void main(String[] args) {ObjectInputStream ois = null;try {ois = new ObjectInputStream(new FileInputStream("IO\\test.txt"));String s = ois.readUTF();Person o = (Person) ois.readObject();System.out.println(o.toString());} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} finally {if (ois != null) {try {ois.close();} catch (IOException e) {e.printStackTrace();}}}} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的让你的对象跑出内存,写入到磁盘或者进行网络传输,一文掌握Java对象序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaIO流(2)--IO流原理、流的
- 下一篇: 周渝民个人资料简介(周渝民的演艺经历及感