java 對象經常需要在網絡中以 socket 傳輸或者需要保存到文件中。這時不管 java 對象是文件、數據、圖像還是其他格式,都可以轉換為一個 byte[] 數組保存到文件或者通過網絡傳輸。這種轉換方式就叫做序列化。將文件或者網絡傳輸中得到的 byte[] 數組轉換為 java 對象就叫做反序列化。
怎么使用
如果一個 Java 對象要能被序列化,必須實現一個特殊的 java.io.Serializable 接口
public interface Serializable {
}
Serializable 接口沒有定義任何的方法,是一個空接口。為什么要有一個這樣的接口?主要是因為安全。如果沒有這個接口就代表著所有 java 對象都可以被序列化到磁盤上,然后通過反序列化看到所有屬性的數據。有了這個 Serializable 就可以讓開發人員選擇 java 對象可以被序列化和反序列化,就增加了安全性。
序列化
下面例子是將一個 java 對象序列化后保存到文件。
import java.io.Serializable;
public class Order implements Serializable {
private Long orderId;
private String orderNo;
private String consignee;//收件人
private String deliveryAddress;//收貨地址
//getter 和 setter
@Override
public String toString() {
return "OrderDTO{" +
"orderId=" + orderId +
", orderNo='" + orderNo + ''' +
", consignee='" + consignee + ''' +
", deliveryAddress='" + deliveryAddress + ''' +
'}';
}
}
把一個 Java 對象變為 byte[] 數組,需要使用 ObjectOutputStream。它負責把一個Java 對象寫入一個字節流:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
OrderDTO orderDTO = new OrderDTO();
orderDTO.setOrderId(1L);
orderDTO.setOrderNo("123456");
orderDTO.setConsignee("李四");
orderDTO.setDeliveryAddress("xxx路xxx弄xxxx號");
OrderDTO orderDTO2 = new OrderDTO();
orderDTO2.setOrderId(2L);
orderDTO2.setOrderNo("78901");
orderDTO2.setConsignee("王五");
orderDTO2.setDeliveryAddress("yyy路yyy弄yyyy號");
List< OrderDTO > list = new ArrayList< >();
list.add(orderDTO);
list.add(orderDTO2);
FileOutputStream fos = new FileOutputStream("D:/order.txt");
try ( ObjectOutputStream os = new ObjectOutputStream(fos)){
os.writeObject(list);
}
System.out.println("序列化成功");
}
}
這個時候就將兩個 OrderDTO 對象序列化到了 D:/order.txt 中。
反序列化
序列化文件在本地打開都是亂碼的,這應該用反序列化將文件解析成對象。
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
List< OrderDTO > list = new ArrayList< >();
FileInputStream fis = new FileInputStream("D:/order.txt");
try (ObjectInputStream is = new ObjectInputStream(fis)) {
list = (List< OrderDTO >)is.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
for (OrderDTO orderDTO : list){
System.out.println(orderDTO.toString());
}
}
}
輸出結果:
OrderDTO{orderId=1, orderNo='123456', consignee='李四', deliveryAddress='xxx路xxx弄xxxx號'}
OrderDTO{orderId=2, orderNo='78901', consignee='王五', deliveryAddress='yyy路yyy弄yyyy號'}
注意點
- 靜態變量和 transient 關鍵字修飾的變量不能被序列化
- 反序列化的時候,字節流中的 serialVersionUID 和實體類中的 serialVersionUID 的不一致會拋出異常。serialVersionUID 沒有寫的話,會被默認一個。
- 序列化實現了深克隆,對象引用的每一個對象數據也會被序列化。
總結
- 序列化必須實現 Serializable。
- serialVersionUID 不是必須的。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
接口
+關注
關注
33文章
9519瀏覽量
157015 -
數據
+關注
關注
8文章
7335瀏覽量
94754 -
JAVA
+關注
關注
20文章
3001瀏覽量
116419 -
網絡
+關注
關注
14文章
8264瀏覽量
94698
發布評論請先 登錄
相關推薦
熱點推薦
如何使用Serde進行序列化和反序列化
Serde 是一個用于序列化和反序列化 Rust 數據結構的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化方式。Serde 的特點是代碼簡潔、易于
c語言序列化和反序列化有何區別
這里寫自定義目錄標題c語言序列化和反序列化tplut.htplut.c測試代碼參考c語言序列化和反序列化網絡調用,數據傳輸都需要把數據序列化
發表于 07-14 07:32
SpringMVC JSON框架的自定義序列化與反序列化
,也可以使用fastjson。jackson框架自定義序列化如果項目使用jackson框架做json序列化,推薦的方案是使用@JsonSerialize注解,示例代碼如下:@JsonSerialize
發表于 10-10 16:02
Java對象序列化您不知道的5件事
本文是本系列的第一篇文章,這個系列專門揭示關于 Java 平臺的一些有用 的小知識 — 這些小知識不易理解,但對于解決 Java 編程挑戰遲早有用。
將 Java 對象序列化 API
發表于 11-23 17:53
?20次下載
java序列化和反序列化范例和JDK類庫中的序列化API
一、序列化和反序列化的概念 把對象轉換為字節序列的過程稱為對象的序列化。 把字節序列恢復為對象的過程稱為對象的反
發表于 09-27 10:13
?6次下載
java序列化的幾種方式
一.Java序列化的作用 有的時候我們想要把一個Java對象變成字節流的形式傳出去,有的時候我們想要從一個字節流中恢復一個Java對象。例如,有的時候我們想要 把一個
發表于 09-27 11:15
?0次下載
Java反序列化回顯方法
同樣修改yso中Gadgets要執行的java代碼即可實現,通過將執行結果寫入web目錄下的靜態文件再讀取來實現。此法的缺點是當目標不存在可訪問靜態web目錄便無法使用了且要獲取web目錄的絕對路徑,更適用于已知開發框架的反序列化漏洞利用。
什么是序列化 為什么要序列化
什么是序列化? “序列化”(Serialization )的意思是將一個對象轉化為字節流。 這里說的對象可以理解為“面向對象”里的那個對象,具體的就是存儲在內存中的對象數據。 與之相反的過程是“反序列化
ROS中的序列化實現
理解了序列化,再回到ROS。我們發現,ROS沒有采用第三方的序列化工具,而是選擇自己實現,代碼在roscpp_core項目下的roscpp_serialization中,見下圖。這個功能涉及的代碼量
如何用C語言進行json的序列化和反序列化
json是目前最為流行的文本數據傳輸格式,特別是在網絡通信上廣泛應用,隨著物聯網的興起,在嵌入式設備上,也需要開始使用json進行數據傳輸,那么,如何快速簡潔地用C語言進行json的序列化和反序列化
什么時候需要Boost序列化
程序開發中,序列化是經常需要用到的。像一些相對高級語言,比如JAVA, C#都已經很好的支持了序列化,那么C++呢?當然一個比較好的選擇就是用Boost,這個號稱C++準標準庫的東西。 什么時候需要
Java序列化怎么使用
評論