一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java 序列化與反序列化的實例詳解

java 序列化與反序列化的實例詳解

2020-12-02 10:39cakin24 Java教程

這篇文章主要介紹了java 序列化與反序列化的實例詳解的相關資料,需要的朋友可以參考下

 1.Java序列化反序列化

 Java序列化是指把Java對象轉換為字節序列的過程;而Java反序列化是指把字節序列恢復為Java對象的過程。

 2.為什么需要序列化與反序列化

 我們知道,當兩個進程進行遠程通信時,可以相互發送各種類型的數據,包括文本、圖片、音頻、視頻等, 而這些數據都會以二進制序列的形式在網絡上傳送。那么當兩個Java進程進行通信時,能否實現進程間的對象傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反序列化了。換句話說,一方面,發送方需要把這個Java對象轉換為字節序列,然后在網絡上傳送;另一方面,接收方需要從字節序列中恢復出Java對象。

 序列化簡介

Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。

將序列化對象寫入文件之后,可以從文件中讀取出來,并且對它進行反序列化,也就是說,對象的類型信息、對象的數據,還有對象中的數據類型可以用來在內存中新建對象。
整個過程都是 Java 虛擬機(JVM)獨立的,也就是說,在一個平臺上序列化的對象可以在另一個完全不同的平臺上反序列化該對象。

ObjectInputStreamObjectOutputStream 是高層次的數據流,它們包含序列化和反序列化對象的方法。

ObjectOutputStream 類包含很多寫方法來寫各種數據類型,但是一個特別的方法例外:

java" id="highlighter_227950">
?
1
publicfinalvoidwriteObject(Objectx)throwsIOException

上面的方法序列化一個對象,并將它發送到輸出流。相似的 ObjectInputStream 類包含如下反序列化一個對象的方法:

?
1
publicfinalObjectreadObject()throwsIOException, ClassNotFoundException

該方法從流中取出一個對象,并將對象反序列化。它的返回值為Object,因此,你需要將它轉換成合適的數據類型。
為了演示序列化在Java中是怎樣工作的,我們定義Employee類,該類實現了Serializable 接口。

Employee.java 文件代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Employee implements java.io.Serializable
{
  public String name;
  public String address;
  public transient int SSN;
  public int number;
  public void mailCheck()
  {
   System.out.println("Mailing a check to " + name
              + " " + address);
  }
}

注意,一個類的對象要想序列化成功,必須滿足兩個條件:

1、該類必須實現 java.io.Serializable 對象。

2、該類的所有屬性必須是可序列化的。如果有一個屬性不是可序列化的,則該屬性必須注明是短暫的。
如果你想知道一個 Java 標準類是否是可序列化的,請查看該類的文檔。檢驗一個類的實例是否能序列化十分簡單, 只需要查看該類有沒有實現 java.io.Serializable接口。

序列化對象

ObjectOutputStream 類用來序列化一個對象,如下的 SerializeDemo 例子實例化了一個 Employee 對象,并將該對象序列化到一個文件中。

該程序執行后,就創建了一個名為 employee.ser 文件。該程序沒有任何輸出,但是你可以通過代碼研讀來理解程序的作用。

注意: 當序列化一個對象到文件時, 按照 Java 的標準約定是給文件一個 .ser 擴展名。

SerializeDemo.java 文件代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.*;
  
public class SerializeDemo
{
  public static void main(String [] args)
  {
   Employee e = new Employee();
   e.name = "Reyan Ali";
   e.address = "Phokka Kuan, Ambehta Peer";
   e.SSN = 11122333;
   e.number = 101;
   try
   {
     FileOutputStream fileOut =
     new FileOutputStream("employee.ser");
     ObjectOutputStream out = new ObjectOutputStream(fileOut);
     out.writeObject(e);
     out.close();
     fileOut.close();
     System.out.println("Serialized data is saved in employee.ser");
   }catch(IOException i)
   {
     i.printStackTrace();
   }
  }
}

反序列化對象

下面的 DeserializeDemo 程序實現了反序列化,employee.ser 存儲了 Employee 對象。

DeserializeDemo.java 文件代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.*;
public class DeserializeDemo 
{
    public static void main(String [] args)
    {
     Employee e = null;
     try
     {
       FileInputStream fileIn = new FileInputStream("employee.ser");
       ObjectInputStream in = new ObjectInputStream(fileIn);
       e = (Employee) in.readObject();
       in.close();
       fileIn.close();
     }catch(IOException i)
     {
       i.printStackTrace();
       return;
     }catch(ClassNotFoundException c)
     {
       System.out.println("Employee class not found");
       c.printStackTrace();
       return;
     }
     System.out.println("Deserialized Employee...");
     System.out.println("Name: " + e.name);
     System.out.println("Address: " + e.address);
     System.out.println("SSN: " + e.SSN);
     System.out.println("Number: " + e.number);
    }
}

以上程序編譯運行結果如下所示:

?
1
2
3
4
5
Deserialized Employee...
Name: Reyan Ali
Address: Phokka Kuan, Ambehta Peer
SSN: 0
Number: 101

這里要注意以下要點:

readObject() 方法中的 try/catch代碼塊嘗試捕獲 ClassNotFoundException 異常。對于 JVM 可以反序列化對象,它必須是能夠找到字節碼的類。如果JVM在反序列化對象的過程中找不到該類,則拋出一個 ClassNotFoundException 異常。

注意,readObject() 方法的返回值被轉化成 Employee 引用。

當對象被序列化時,屬性 SSN 的值為 111222333,但是因為該屬性是短暫的,該值沒有被發送到輸出流。所以反序列化后 Employee 對象的 SSN 屬性為 0。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://cakin24.iteye.com/blog/2344504

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 嘉嘉的丝袜美腿白丝 | 99久久精品免费看国产一区 | а天堂中文最新版在线官网视频 | 香蕉动漫库 | 催眠白丝舞蹈老师小说 | 国产精品久久久久aaaa | 无耻之徒第十一季在线观看 | 视频一区二区国产无限在线观看 | 九九热只有精品 | 91传媒制片厂制作传媒破解版 | 波多野结衣快播 | 娇小异类videos| 五月婷婷俺也去开心 | 精品久久国产 | 成人a级特黄毛片 | 久久成人免费大片 | 国产三级自拍视频 | 亚洲国产精品自在在线观看 | 日本免费观看的视频在线 | 情人我吃糖果小说 | 欧美日韩国产成人综合在线 | 亚洲天天综合网 | 北条麻妃黑人 | 给我一个黄色网址 | 日韩av.com| 精品国产欧美一区二区三区成人 | 日韩精品成人在线 | 为什么丈夫插我我却喜欢被打着插 | 亚洲国产成人综合 | 欧美成人免费tv在线播放 | china中国小帅gayxnxx| cos美女被黄网站 | 日韩风月片 | 国产欧美视频高清va在线观看 | 俺不色| 四虎影在线永久免费观看 | 国产日韩一区二区三区 | 国产三及| 免费国产之a视频 | 国产在线99 | 欧美日韩国产另类一区二区三区 |