什麼是Java序列化,如何實現java序列化
簡要解釋:
序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。
序列化是為了解決在對物件流進行讀寫操作時所引發的問題。序列化的實現:將需要被序列化的類實現Serializable介面,該介面沒有需要實現的方法,implements Serializable只是為了標註該物件是可被序列化的,
然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(物件流)物件,接著,使用ObjectOutputStream物件的writeObject(Object obj)方法就可以將引數為obj的物件寫出(即儲存其狀態),要恢復的話則用輸入流。
詳細解釋:
當兩個程式在進行遠端通訊時,彼此可以傳送各種型別的資料。無論是何種型別的資料,都會以二進位制序列的形式在網路上傳送。傳送方需要把這個Java物件轉換為位元組序列,才能在網路上傳送;接收方則需要把位元組序列再恢復為Java物件。
只能將支援 java.io.Serializable 介面的物件寫入流中。每個 serializable 物件的類都被編碼,編碼內容包括類名和類簽名、物件的欄位值和陣列值,以及從初始物件中引用的其他所有物件的閉包。
1.概念
序列化:把Java物件轉換為位元組序列的過程。
反序列化:把位元組序列恢復為Java物件的過程。
2.用途
物件的序列化主要有兩種用途:
1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中;
2) 在網路上傳送物件的位元組序列。
3.物件序列化
序列化API
java.io.ObjectOutputStream代表物件輸出流,它的writeObject(Object obj)方法可對引數指定的obj物件進行序列化,把得到的位元組序列寫到一個目標輸出流中。只有實現了Serializable和Externalizable介面的類的物件才能被序列化。
java.io.ObjectInputStream代表物件輸入流,它的readObject()方法從一個源輸入流中讀取位元組序列,再把它們反序列化為一個物件,並將其返回。
程式碼示例
import java.io.*;
import java.util.Date;
public class ObjectSaver {
public static void main(String[] args) throws Exception {
/*其中的 D:\\objectFile.obj 表示存放序列化物件的檔案*/
//序列化物件
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj"));
Customer customer = new Customer("王麻子", 24);
out.writeObject("你好!");
//寫入字面值常量
out.writeObject(new Date());
//寫入匿名Date物件
out.writeObject(customer);
//寫入customer物件
out.close();
//反序列化物件
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj"));
System.out.println("obj1 " + (String) in.readObject());
//讀取字面值常量
System.out.println("obj2 " + (Date) in.readObject());
//讀取匿名Date物件
Customer obj3 = (Customer) in.readObject();
//讀取customer物件
System.out.println("obj3 " + obj3);
in.close();
}
}
class Customer implements Serializable {
private String name;
private int age;
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "name=" + name + ", age=" + age;
}
}
執行結果
4.說明
讀取物件的順序與寫入時的順序要一致。
物件的預設序列化機制寫入的內容是:物件的類,類簽名,以及非瞬態和非靜態欄位的值。
相關文章
- 什麼是Java序列化?如何實現序列化?Java
- Java序列化是什麼Java
- 什麼是java序列化?什麼情況下需要序列化?Java
- 序列化和反序列化的底層實現原理是什麼?
- Java中使用FlatBuffer實現序列化Java
- Java中使用FlatBuffers實現序列化Java
- 為什麼Java需要物件的序列化Java物件
- 序列化ID是什麼?
- 什麼是Java多型?如何實現Java多型?Java多型
- java序列化Java
- Java物件的序列化和反序列化實踐Java物件
- Java序列化、反序列化、反序列化漏洞Java
- Java:對一個物件序列化和反序列化的簡單實現Java物件
- Java安全基礎之Java序列化與反序列化Java
- Java的序列化和反序列化Java
- Java的序列化與反序列化Java
- java反序列化Java
- 什麼是原子操作?Java如何實現原子操作?Java
- [Java基礎]序列化和反序列化Java
- Java中的序列化與反序列化Java
- Java是如何實現跨平臺的?原理是什麼?Java
- 夯實Java基礎系列22:一文讀懂Java序列化和反序列化Java
- java自定義序列化Java
- java的序列化SerializableJava
- Java基礎——序列化Java
- 淺談Java序列化Java
- java 反序列化 cc7 復現Java
- java 反序列化 cc1 復現Java
- java 反序列化 cc6 復現Java
- 從java的序列化和反序列化說起Java
- Java物件的序列化與反序列化-Json篇Java物件JSON
- 為什麼需要序列化和反序列化
- java反序列化基礎Java
- 深入理解 Java 序列化Java
- Java序列化的狀態Java
- Tinking in Java ---Java的NIO和物件序列化Java物件
- java反序列化——apache-shiro復現分析JavaApache
- 使用 Jackson 序列化和反序列化 java.sql.BlobJavaSQL