国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

實例分析java對象的序列化和反序列化

2024-07-14 08:42:27
字體:
來源:轉載
供稿:網友

引言:

  序列化是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程,在序列化期間,對象將其帶你過去的狀態寫入到臨時或持儲存區,反序列化就是重新創建對象的過程,此對象來自于臨時或持久儲存區。

序列化的作用:

  就好比如存儲數據到數據庫,將一些數據持久化到數據庫中,而有時候需要將對象持久化,雖然說將對象狀態持久化的方式有很多,但是java給我們提供了一種很便捷的方式,那就是序列化,序列化可以實現對象到文件之間的直接轉換,實現細節對我們隱藏。

  具體的三種用途:
•將對象的狀態信息持久化保存到硬盤上
•將對象信息在網絡上傳輸
•深度克隆(就是序列化后再反序列化)

方式一:實現Serializable接口,通過序列化流

  實現Serializable接口,通過ObjectOutputStream和ObjectInputStream將對象序列化和反序列化。

import java.io.*;public class User implements Serializable {  private static final long serialVersionUID = 1L;  private String name;  private int age;  public User(String name, int age) {    this.name = name;    this.age = age;  }  @Override  public String toString() {    return "User{" +        "name='" + name + '/'' +        ", age=" + age +        '}';  }  public static void main(String[] args) throws IOException, ClassNotFoundException {//    User user = new User("gol",22);//    ByteArrayOutputStream bo = new ByteArrayOutputStream();//    ObjectOutputStream oo = new ObjectOutputStream(bo);//    oo.writeObject(user);//序列化.user寫入字節數組流中//    ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());//    ObjectInputStream oi = new ObjectInputStream(bi);//    User userSer = (User) oi.readObject();//反序列化//    System.out.println(userSer);    User user = new User("gol",22);    FileOutputStream fos = new FileOutputStream("a.txt");    ObjectOutputStream oo = new ObjectOutputStream(fos);    oo.writeObject(user);//序列化.user寫入文件中    FileInputStream fis = new FileInputStream("a.txt");    ObjectInputStream oi = new ObjectInputStream(fis);    User userSer = (User) oi.readObject();//反序列化    System.out.println(userSer);    oi.close();    fis.close();    oo.close();    fos.close();  }}

方式二:實現Externalizable接口,重寫writeExternal和readExternal方法

  Externalizable接口繼承了Serializable接口,替我們封裝了兩個方法,一個用于序列化,一個用于反序列化。這種方式是將屬性序列化,注意這種方式transient修飾詞將失去作用,也就是說被transient修飾的屬性,只要你在writeExternal方法中序列化了該屬性,照樣也會得到序列化。

import java.io.*;public class User implements Externalizable {  private static final long serialVersionUID = 1L;  private String name;  private int age;  public User() {  }  public User(String name, int age) {    this.name = name;    this.age = age;  }  @Override  public String toString() {    return "User{" +        "name='" + name + '/'' +        ", age=" + age +        '}';  }  @Override  public void writeExternal(ObjectOutput out) throws IOException {    out.writeObject(this.name);//將屬性分別序列化    out.writeObject(this.age);  }  @Override  public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {    this.name=(String)in.readObject();//反序列化屬性    this.age=(int)in.readObject();  }  public static void main(String[] args) throws IOException, ClassNotFoundException {    FileOutputStream fos = new FileOutputStream("a.txt");    ObjectOutputStream oo = new ObjectOutputStream(fos);    FileInputStream fis = new FileInputStream("a.txt");    ObjectInputStream oi = new ObjectInputStream(fis);    User user = new User("gol",19);    user.writeExternal(oo);//序列化    User userEnr = new User();    userEnr.readExternal(oi);//反序列化    System.out.println(userEnr);    oi.close();    fis.close();    oo.close();    fos.close();  }}

總結:

注意以下三點:

•Serializable接口是標記接口,是個空接口,用于標識該類可以被序列化。
•transient是屬性修飾符,被其修飾的屬性將不會被序列化,但是使用方式二的話,明確寫明該屬性序列化同樣可以得到序列化。
•serialVersionUID屬性是類的序列化標識ID,若序列化的對象和反序列化的對象其serialVersionUID屬性不一樣則會報錯。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台北市| 高淳县| 太仓市| 阿鲁科尔沁旗| 盐源县| 南涧| 浦城县| 柘荣县| 乐清市| 河曲县| 平顺县| 宁明县| 霞浦县| 大渡口区| 宽甸| 兴国县| 手游| 东乌珠穆沁旗| 成安县| 达尔| 张掖市| 江阴市| 白城市| 洪洞县| 孝义市| 温宿县| 河间市| 霍州市| 通城县| 禹城市| 抚顺市| 蒙山县| 睢宁县| 恩平市| 屏东市| 怀宁县| 金寨县| 左云县| 明星| 克东县| 麟游县|