日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 操作序列_JAVA序列化操作详解

發(fā)布時間:2023/12/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 操作序列_JAVA序列化操作详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、概述

很多時候我們需要將對象的信息以文件的形式存儲到硬盤上以便以后可以恢復使用。我們可以按照一定的格式將變量的值依次寫到特定格式的文件中。但有時候我們希望只有我們自己可以讀懂它并且修改它,這就是序列化的作用。

概念:將對象轉化為字節(jié)序列的過程稱為對象的序列化。而把字節(jié)序列恢復為對象的過程稱為對象的反序列化。

序列化的兩種主要用途:

(1):將對象的字節(jié)序列以文件的形式存儲到硬盤上。

(2):在網(wǎng)絡上傳輸對象的字節(jié)序列。

二、實現(xiàn)序列化

只需要讓類實現(xiàn)Serializable這個接口即可。此接口沒有任何方法,是一個標識性的接口用來標識此類可以被序列化。

三、具體例子

Pond.java

1 packagebean;2 importjava.io.Serializable;3

4 public class Pond implementsSerializable5 {6 private intlength;7 private intwidth;8 private intheight;9

10 public Pond(int length, int width, intheight)11 {12 this.length =length;13 this.width =width;14 this.height =height;15 }16

17 @Override18 publicString toString()19 {20 return length + ", " + width + ", " +height;21 }22 }

Test.java

1 packagetest;2 importjava.io.FileOutputStream;3 importjava.io.ObjectOutputStream;4 importbean.Pond;5

6 public classTest7 {8 @org.junit.Test9 public void test() throwsException10 {11 Pond small = new Pond(1, 2, 3);12 Pond middle = new Pond(4, 5, 6);13 Pond large = new Pond(7, 8, 9);14 System.out.println("Before");15 System.out.println(small);16 System.out.println(middle);17 System.out.println(large);18 FileOutputStream fos = new FileOutputStream("pond.hxy");19 ObjectOutputStream oos = newObjectOutputStream(fos);20 oos.writeObject(small);21 oos.writeObject(middle);22 oos.writeObject(large);23 oos.close();24 }25 }

pond.hxy中內(nèi)容如下:

反序列化:

1 packagetest;2 importjava.io.FileInputStream;3 importjava.io.FileOutputStream;4 importjava.io.IOException;5 importjava.io.ObjectInputStream;6 importjava.io.ObjectOutputStream;7

8 importbean.Pond;9

10 public classTest11 {12 @org.junit.Test13 public void test() throwsIOException, ClassNotFoundException14 {15 Pond small = new Pond(1, 2, 3);16 Pond middle = new Pond(4, 5, 6);17 Pond large = new Pond(7, 8, 9);18 FileOutputStream fos = new FileOutputStream("pond.hxy");19 ObjectOutputStream oos = newObjectOutputStream(fos);20 oos.writeObject(small);21 oos.writeObject(middle);22 oos.writeObject(large);23 oos.close();24 small = null;25 middle = null;26 large = null;27 FileInputStream fis = new FileInputStream("pond.hxy");28 ObjectInputStream ois = newObjectInputStream(fis);29 small =(Pond)ois.readObject();30 middle =(Pond)ois.readObject();31 large =(Pond)ois.readObject();32 System.out.println(small);33 System.out.println(middle);34 System.out.println(large);35 System.out.println("運行結束");36 }37 }

運行結果:

si

四、序列化ID

private static final long serialVersionUID = 1L; 其實就是這個東西。它的作用可以理解成是用于唯一標識一個類的long型變量。

反序列化的時候,JVM會把字節(jié)流中的序列化ID和本地相應類的ID作比較,如果不一致則會拋出異常。

如果沒有顯示定義序列化ID,JAVA序列化機制會自動生成一個序列化ID,這種情況下,只有當時編譯生成的類具有正確的序列化ID。

所以總的來說,顯式地定義序列化ID有兩種用途:

1、 在某些場合,希望類的不同版本對序列化兼容,需要確保類的不同版本具有相同的serialVersionUID。

2、 在某些場合,不希望類的不同版本對序列化兼容,需要確保類的不同版本具有不同的serialVersionUID。

五、其他說明

每次調(diào)用readObject()都會從stream中讀出下一個對象,讀取順序與寫入順序是相同的,且次數(shù)超過會拋出異常。

當對象被序列化的時候,被該對象引用的實例變量也會被序列化。且所有被引用的對象也會被序列化。這些操作都是自動進行的。

如果其中有不能序列化的對象(沒有實現(xiàn)序列化接口),執(zhí)行期間會拋出異常。

反序列化后的對象與原對象內(nèi)容相同,但是地址不同。所以序列化可以用來做深拷貝。

總結

以上是生活随笔為你收集整理的java 操作序列_JAVA序列化操作详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。