淺談java什么時(shí)候需要用序列化?
一、Java序列化概述
簡(jiǎn)單說(shuō)就是為了保存在內(nèi)存中的各種對(duì)象的狀態(tài)(也就是實(shí)例變量,不是方法),并且可以把保存的對(duì)象狀態(tài)再讀出來(lái)。雖然你可以用你自己的各種各樣的方法來(lái)保存objectstates,但是Java給你提供一種應(yīng)該比你自己好的保存對(duì)象狀態(tài)的機(jī)制,那就是序列化。
- 序列化:將Java對(duì)象轉(zhuǎn)換成字節(jié)流的過(guò)程。
- 反序列化:將字節(jié)流轉(zhuǎn)換成Java對(duì)象的過(guò)程。
- 當(dāng)Java對(duì)象需要在網(wǎng)絡(luò)上傳輸或者持久化存儲(chǔ)到文件中時(shí),就需要對(duì)Java對(duì)象進(jìn)行序列化處理。
- 序列化的實(shí)現(xiàn):類實(shí)現(xiàn)Serializable接口,這個(gè)接口沒(méi)有需要實(shí)現(xiàn)的方法。實(shí)現(xiàn)Serializable接口是為了告訴jvm這個(gè)類的對(duì)象可以被序列化。
二、什么時(shí)候用序列化?
- 當(dāng)你想把的內(nèi)存中的對(duì)象狀態(tài)保存到一個(gè)文件中或者數(shù)據(jù)庫(kù)中時(shí)候;
- 當(dāng)你想用套接字在網(wǎng)絡(luò)上傳送對(duì)象的時(shí)候;
- 當(dāng)你想通過(guò)RMI傳輸對(duì)象的時(shí)候。
三、項(xiàng)目創(chuàng)建很多對(duì)象怎么優(yōu)化?
場(chǎng)景:
- 當(dāng)一個(gè)類存在繼承關(guān)系時(shí),你創(chuàng)建一個(gè)子類的對(duì)象時(shí),如果在沒(méi)有明確指定的情況下,子類是會(huì)隱式的去調(diào)用父類的無(wú)參構(gòu)造的。假設(shè),我們需要頻繁創(chuàng)建的對(duì)象,是一個(gè)繼承關(guān)系比較深的類的話,調(diào)用構(gòu)造函數(shù)的開銷不容小窺。
- 如果一時(shí)間內(nèi),頻繁創(chuàng)建某對(duì)象時(shí),這些平時(shí)不顯眼的消耗一疊加起來(lái),就變得很客觀了。但是,當(dāng)我們使用clone的話,就可以避免這個(gè)問(wèn)題。
- 大數(shù)據(jù)開發(fā),消費(fèi)kafka后,實(shí)例化到對(duì)象上,頻繁創(chuàng)建對(duì)象。
優(yōu)化思路一:加條件判斷
假如創(chuàng)建的對(duì)象,需要在 if 判斷條件中使用,則在 if 判斷條件中new新對(duì)象,這樣可以減少對(duì)象的創(chuàng)建。
優(yōu)化思路二:使用clone淺拷貝
clone的最大特點(diǎn)就是,不會(huì)去調(diào)用任何構(gòu)造方法
- 對(duì)于需要頻繁創(chuàng)建的實(shí)體類,需要實(shí)現(xiàn)Serializable和Cloneable接口
- 在此實(shí)體類中寫一個(gè)getInstance(),其中就是返回clone()
- 在方法中新建對(duì)象的時(shí)候,直接getInstance()就可以。
import lombok.Data; import java.io.Serializable; @Data public class User implements Serializable,Cloneable{ ? ? private static final long serialVersionUID = 1L; ? ? private static User ?user = new User(); ? ? /** ? ? ?* 用戶id ? ? ?*/ ? ? private Long userId; ? ? /** ? ? ?* 用戶名稱 ? ? ?*/ ? ? private String userName; ? ? /** ? ? ?* 調(diào)用對(duì)象創(chuàng)建優(yōu)化 ? ? ?* @return ? ? ?*/ ? ? public static User getInstance(){ ? ? ? ? try { ? ? ? ? ? ? return (User) user.clone(); ? ? ? ? } catch (CloneNotSupportedException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? ? ? return new User(); ? ? } }
if (flag) { ? ? ?// 將創(chuàng)建對(duì)象放到if中,不進(jìn)入if則不創(chuàng)建,提高效率 ? ? ?//SysMenuManagerGrant grant = new SysMenuManagerGrant(); ? ? ?User user = User.getInstance(); }
到此這篇關(guān)于淺談java什么時(shí)候需要用序列化 的文章就介紹到這了,更多相關(guān)java 序列化 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)分頁(yè)的幾種方法詳細(xì)解析
這篇文章主要介紹了Java實(shí)現(xiàn)分頁(yè)的幾種方法詳細(xì)解析,在Java中想實(shí)現(xiàn)分頁(yè)功能有幾種常用的方法,今天我們就來(lái)詳細(xì)解析一下,文中提供了解決思路和部分實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-11-11SpringBoot整合Netty心跳機(jī)制過(guò)程詳解
這篇文章主要介紹了SpringBoot整合Netty心跳機(jī)制過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02SpringBoot使用Guava實(shí)現(xiàn)日志脫敏的示例代碼
本文主要介紹了SpringBoot使用Guava實(shí)現(xiàn)日志脫敏的示例代碼,使用Guava中的Strings、Maps和CharMatcher類來(lái)進(jìn)行日志脫敏,保護(hù)敏感數(shù)據(jù)的安全,感興趣的可以了解一下2024-01-01Spring Boot日志技術(shù)logback原理及配置解析
這篇文章主要介紹了Spring Boot日志技術(shù)logback原理及用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07解決微服務(wù)feign調(diào)用添加token的問(wèn)題
這篇文章主要介紹了解決微服務(wù)feign調(diào)用添加token的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06SpringBoot整合Milvus的實(shí)現(xiàn)
本文主要介紹了SpringBoot整合Milvus的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07SpringMVC JSON數(shù)據(jù)交互及RESTful支持實(shí)現(xiàn)方法
這篇文章主要介紹了SpringMVC JSON數(shù)據(jù)交互及RESTful支持實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Spring Boot+Jpa多數(shù)據(jù)源配置的完整步驟
這篇文章主要給大家介紹了關(guān)于Spring Boot+Jpa多數(shù)據(jù)源配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01