最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中對象的序列化與反序列化深入講解

 更新時間:2018年09月20日 08:27:21   作者:GolLong  
這篇文章主要給大家介紹了關于java中對象的序列化與反序列化的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

引言:

序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發(fā)的問題。

  • 把對象轉換為字節(jié)序列的過程稱為對象的序列化。
  • 把字節(jié)序列恢復為對象的過程稱為對象的反序列化。

在很多應用中,需要對某些對象進行序列化,讓它們離開內(nèi)存空間,入住物理硬盤,以便長期保存。比如最常見的是Web服務器中的Session對 象,當有 10萬用戶并發(fā)訪問,就有可能出現(xiàn)10萬個Session對象,內(nèi)存可能吃不消,于是Web容器就會把一些seesion先序列化到硬盤中,等要用了,再把保存在硬盤中的對象還原到內(nèi)存中。

當兩個進程在進行遠程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù)。無論是何種類型的數(shù)據(jù),都會以二進制序列的形式在網(wǎng)絡上傳送。發(fā)送方需要把這個Java對象轉換為字節(jié)序列,才能在網(wǎng)絡上傳送;接收方則需要把字節(jié)序列再恢復為Java對象。

序列化是將對象的狀態(tài)信息轉換為可以存儲或傳輸?shù)男问降倪^程,在序列化期間,對象將其帶你過去的狀態(tài)寫入到臨時或持儲存區(qū),反序列化就是重新創(chuàng)建對象的過程,此對象來自于臨時或持久儲存區(qū)。

序列化的作用:

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

具體的三種用途:

  • 將對象的狀態(tài)信息持久化保存到硬盤上
  • 將對象信息在網(wǎng)絡上傳輸
  • 深度克隆(就是序列化后再反序列化)

方式一:實現(xiàn)Serializable接口,通過序列化流

實現(xiàn)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寫入字節(jié)數(shù)組流中
//  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();
 }
}

方式二:實現(xiàn)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屬性不一樣則會報錯。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Java?Mybatis框架由淺入深全解析上篇

    Java?Mybatis框架由淺入深全解析上篇

    MyBatis是一個優(yōu)秀的持久層框架,它對jdbc的操作數(shù)據(jù)庫的過程進行封裝,使開發(fā)者只需要關注SQL本身,而不需要花費精力去處理例如注冊驅(qū)動、創(chuàng)建connection、創(chuàng)建statement、手動設置參數(shù)、結果集檢索等jdbc繁雜的過程代碼本文將為大家初步的介紹一下MyBatis的使用
    2022-07-07
  • OpenCV實現(xiàn)反閾值二值化

    OpenCV實現(xiàn)反閾值二值化

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)反閾值二值化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java中addMouseListener()方法的使用

    java中addMouseListener()方法的使用

    這篇文章主要介紹了java中addMouseListener()方法的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 深入了解SpringBoot中的統(tǒng)一返回和統(tǒng)一異常處理

    深入了解SpringBoot中的統(tǒng)一返回和統(tǒng)一異常處理

    這篇文章主要為大家詳細介紹了SpringBoot項目中常用的統(tǒng)一返回結果和統(tǒng)一異常處理,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2024-01-01
  • 帶有@Transactional和@Async的循環(huán)依賴問題的解決

    帶有@Transactional和@Async的循環(huán)依賴問題的解決

    這篇文章主要介紹了帶有@Transactional和@Async的循環(huán)依賴問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • SpringBoot項目yml配置文件不自動提示解決方案

    SpringBoot項目yml配置文件不自動提示解決方案

    這篇文章主要介紹了SpringBoot項目配置文件.yaml/.yml文件編寫時沒有自動提示的解決方案,文章通過圖文結合的方式給大家講解的非常詳細,需要的朋友可以參考下
    2024-06-06
  • @ComponentScan注解用法之包路徑占位符解析

    @ComponentScan注解用法之包路徑占位符解析

    這篇文章主要介紹了@ComponentScan注解用法之包路徑占位符解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java中常見XML解析器的使用詳解(JAXP,DOM4J,Jsoup,JsoupXPath)

    java中常見XML解析器的使用詳解(JAXP,DOM4J,Jsoup,JsoupXPath)

    為了處理和操作XML數(shù)據(jù),我們需要使用XML解析器,本文將介紹幾種常用的XML解析器,包括JAXP、DOM4J、Jsoup和JsoupXPath,需要的小伙伴可以參考一下
    2023-11-11
  • Maven入門之使用Nexus搭建Maven私服及上傳下載jar包

    Maven入門之使用Nexus搭建Maven私服及上傳下載jar包

    這篇文章主要介紹了Maven入門之使用Nexus搭建Maven私服及上傳下載jar包,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • java開發(fā)中使用IDEA活動模板快速增加注釋的方法

    java開發(fā)中使用IDEA活動模板快速增加注釋的方法

    這篇文章主要介紹了java開發(fā)中使用IDEA活動模板快速增加注釋,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

筠连县| 修水县| 容城县| 韶山市| 汉阴县| 漳州市| 英吉沙县| 咸阳市| 香河县| 铜陵市| 古浪县| 福安市| 雅安市| 黑水县| 会东县| 绥化市| 嫩江县| 蓬安县| 应城市| 九江市| 鄂托克旗| 湘西| 哈密市| 工布江达县| 德昌县| 马山县| 沙洋县| 通化县| 巨鹿县| 高唐县| 方山县| 紫金县| 宜君县| 临江市| 象州县| 布拖县| 邢台市| 双城市| 罗平县| 林周县| 邯郸县|