java中的Serializable、transient關(guān)鍵字詳解
1、Serializable 序列化接口
如下,寫一個(gè)類實(shí)現(xiàn)Serializable,并標(biāo)注序列化版本號(hào)
public class Foo implements Serializable { private static final long serialVersionUID = -5809782578272943999L; private int id; private String name; . . . }
實(shí)現(xiàn)序列化接口Serializable有什么用?
1.1、有什么用?
沒有實(shí)現(xiàn)序列化的對(duì)象都保存在堆(Heap)中。 實(shí)現(xiàn)序列化后可以保存到一個(gè)文件里。
如下例:
// class Foo implements Serializable Foo foo = new Foo(); foo.setId(1); foo.setName("ho"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("foo.ser")); oos.writeObject(student); oos.flush(); oos.close();
foo實(shí)例化后被保存在foo.ser文件中
foo.ser
Foo [id=1, name=ho]
1.2、什么情況下用?
1、該對(duì)象數(shù)據(jù)需要寫入數(shù)據(jù)庫(kù)
2、該對(duì)象需要通過網(wǎng)絡(luò)、RMI、緩存等傳遞或保存
3、該對(duì)象需要在jvm與jvm間交流
1.3、要注意些什么
1、序列化只會(huì)保存屬性值,不會(huì)保存方法
2、通過反序列化可以把序列化后的內(nèi)容恢復(fù)成對(duì)象
3、聲明為 static 和 transient 的成員變量,不能被序列化,static 成員變量是描述類級(jí)別的屬性,transient 表示臨時(shí)數(shù)據(jù)。
4、某個(gè)類可以被序列化,則其子類也可以被序列化
5、反序列化讀取序列化對(duì)象的順序要保持一致
2、transient 關(guān)鍵字
如下是LinkedList的部分源碼
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { transient int size = 0; transient Node<E> first; . . . }
我們能看到size、first兩個(gè)屬性前面加了transient關(guān)鍵字。 transient 關(guān)鍵字,主要用來忽略我們不希望進(jìn)行序列化的變量。
2.1、什么情況下用?
首先,當(dāng)一個(gè)類需要序列化,但是某個(gè)屬性不需要被序列化就可以加此關(guān)鍵字。 都有哪些場(chǎng)景呢?
1、一些敏感信息,如密碼、銀行卡號(hào)等
2、非必要信息,如LinkedList中的大小、位置等
2.2、要注意些什么
1、需要實(shí)現(xiàn)Serializable接口。
2、transient關(guān)鍵字只能修飾變量,而不能修飾方法和類。
3、本地變量是不能被transient關(guān)鍵字修飾的
4、實(shí)現(xiàn)Externalizable接口,需要在writeExternal方法中進(jìn)行手工指定所要序列化的變量,這與是否被transient修飾無關(guān)。
3、序列化與反序列化
ObjectOutputStream:IO 類,包含序列化對(duì)象的方法,writeObject()
ObjectInputStream:IO 類,包含反序列化對(duì)象的方法,readObject()
序列化示例:
public static void main(String[] args) throws Exception { // 創(chuàng)建 Java 對(duì)象(Foo必須已經(jīng)實(shí)現(xiàn)了Serializable接口) Foo foo = new Foo(22,"tt"); // 對(duì)象輸出流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("foo")); // 使用 writeObject 序列化對(duì)象 oos.writeObject(student); // 刷新 oos.flush(); // 關(guān)閉流 oos.close(); }
反序列化示例:
public static void main(String[] args) throws Exception { // 對(duì)象輸入流 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("foo")); // 使用 readObject() 反序列化 Object obj = ois.readObject(); // 使用對(duì)象 System.out.println(obj); // 關(guān)閉流 ois.close(); }
反序列化需要借助文件輸入流讀取指定路徑的二進(jìn)制文件。
3.1、serialVersionUID 版本號(hào)的作用
JVM 首先會(huì)通過類名來區(qū)分 Java 類,類名不同,則不是同一個(gè)類。當(dāng)類名相同時(shí),JVM 就會(huì)通過序列化版本號(hào)來區(qū)分 Java 類,如果序列化版本號(hào)相同就為同一個(gè)類,序列化版本號(hào)不同就為不同的類。
到此這篇關(guān)于java中的Serializable、transient關(guān)鍵字詳解的文章就介紹到這了,更多相關(guān)java的Serializable、transient內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中實(shí)現(xiàn)線程的超時(shí)中斷方法實(shí)例
之前在使用Java實(shí)現(xiàn)熔斷降級(jí)組件的時(shí)候,需要實(shí)現(xiàn)接口請(qǐng)求的超時(shí)中斷,通過查找相關(guān)資料了解了相關(guān)的方法,下面這篇文章主要給大家介紹了關(guān)于Java中實(shí)現(xiàn)線程的超時(shí)中斷的相關(guān)資料,需要的朋友可以參考下2018-06-06java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)雙向鏈表的示例
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表的示例,需要的朋友可以參考下2014-03-03SpringCloud實(shí)現(xiàn)Redis在各個(gè)微服務(wù)的Session共享問題
Redis是運(yùn)行在內(nèi)存中,查取速度很快。本文重點(diǎn)給大家介紹SpringCloud實(shí)現(xiàn)Redis在各個(gè)微服務(wù)的Session共享,感興趣的朋友一起看看吧2018-08-08springboot常用的請(qǐng)求參數(shù)的接收方式
在Spring?Boot中,接收請(qǐng)求參數(shù)的方式有多種,這篇文章主要為大家整理了9個(gè)常用的方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12MyBatis寫入Json字段以及Json字段轉(zhuǎn)對(duì)象示例詳解
這篇文章主要給大家介紹了關(guān)于MyBatis寫入Json字段以及Json字段轉(zhuǎn)對(duì)象的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Java動(dòng)態(tài)獲取實(shí)現(xiàn)某個(gè)接口下所有的實(shí)現(xiàn)類對(duì)象集合
今天小編就為大家分享一篇關(guān)于Java動(dòng)態(tài)獲取實(shí)現(xiàn)某個(gè)接口下所有的實(shí)現(xiàn)類對(duì)象集合,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12Java 在Word中創(chuàng)建郵件合并模板并合并文本和圖片的操作方法
通過Java程序展示如何來實(shí)現(xiàn)創(chuàng)建模板,并通過郵件合并功能來合并文本數(shù)據(jù)和圖片數(shù)據(jù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07