java 操作序列_JAVA序列化操作详解
一、概述
很多時候我們需要將對象的信息以文件的形式存儲到硬盤上以便以后可以恢復使用。我們可以按照一定的格式將變量的值依次寫到特定格式的文件中。但有時候我們希望只有我們自己可以讀懂它并且修改它,這就是序列化的作用。
概念:將對象轉化為字節(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 使用string_java中s
- 下一篇: java spring redis_sp