1. 程式人生 > 其它 >序列化與反序列化機制

序列化與反序列化機制

序列化機制是為了將物件進行傳輸,將物件通過序列化機制轉換成二進位制流,再通過反序列化恢復成物件

對於系統類,String 和基本資料型別都是預設支援序列化機制的,對於自定義類想要實現序列化機制,

1:繼承Serializable介面

2:建立全域性常量 serialVersionUID public static final long serialVersionUID=14656556L;

3:類裡面的所有屬性必須是可序列化的,如果有另一個自定義類屬性,必須也要去支援此機制

 1 /**
 2  * 物件流的使用:
 3  * ObjectInputStream,ObjectOutputSteam
4 * 作用:用於儲存和讀取基本資料型別資料或物件的處理流,可以把Java中的物件進行傳輸 5 * 允許將記憶體中的Java物件轉換成與平臺無關的二進位制流,從而允許吧這種二進位制流持久的儲存在磁碟上,或者通過網路 6 * 將這種二進位制流傳輸到另一個網路節點,但其它程式獲取了這種二進位制流,就可以恢復成原來的java物件 7 * ************** 8 * 序列化的好處在於可以將任何實現了Serializable介面的物件轉換成位元組資料,使其在傳輸或者儲存時可以被還原 9 * ************** 10 * 序列化是RMI(遠端方法呼叫,Remove Method Invoke)過程的引數和返回值都必須實現的機制,PMI是JavaEE的基礎
11 * 因此序列化機制是JavaEE平臺的基礎 12 * ************* 13 * 如果需要讓某個物件支援序列化機制,必須讓物件所屬的類及其屬性是可序列化的,為了讓某個類是可序列化的, 14 * 該類必須實現如下兩個介面:Serializable,Externalizable 15 * ************ 16 * 對於Static修飾的變數是不能序列化與反序列化的 17 * 18 * 19 * 20 * 21 * 22 */ 23 public class ObjectInputStreamTest implements Serializable{
24 /** 25 * 序列化過程:將記憶體中的Java物件儲存到磁碟中或者通過網路傳輸出去 26 * 使用ObjectInputStream實現 27 */ 28 @Test 29 public void test(){ 30 ObjectOutputStream ob= null; 31 try { 32 ob = new ObjectOutputStream(new FileOutputStream("object.dat")); 33 ob.writeObject(new String("我愛中國")); 34 ob.flush(); 35 ob.writeObject(new hpppp("hpp",20)); 36 ob.flush(); 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } finally { 40 try { 41 ob.close(); 42 } catch (IOException e) { 43 e.printStackTrace(); 44 } 45 } 46 } 47 //反序列化過程:objectInputStream 48 @Test 49 public void test2() throws IOException{ 50 ObjectInputStream obj= new ObjectInputStream(new FileInputStream("object.dat")); 51 Object object= null; 52 try { 53 object = obj.readObject(); 54 hpppp h=(hpppp) obj.readObject(); 55 System.out.println(h); 56 } catch (ClassNotFoundException e) { 57 e.printStackTrace(); 58 } 59 String str=(String) object; 60 System.out.println(str); 61 62 obj.close(); 63 } 64 } 65 class hpppp implements Serializable{ 66 //自定義類可以實現序列化機制的前提 67 // 繼承Serializable介面, 68 // 提供一個全域性常量serialVersionUID 69 // 類裡面的屬性也是要可序列化的,String可以,基本資料型別預設也是可以的 70 public static final long serialVersionUID=-4998231495L; 71 String name; 72 int age; 73 public hpppp(String name, int age) { 74 this.name = name; 75 this.age = age; 76 } 77 78 @Override 79 public String toString() { 80 return name+":"+age; 81 } 82 }