淺談java什么時(shí)候需要用序列化?
一、Java序列化概述
簡單說就是為了保存在內(nèi)存中的各種對(duì)象的狀態(tài)(也就是實(shí)例變量,不是方法),并且可以把保存的對(duì)象狀態(tài)再讀出來。雖然你可以用你自己的各種各樣的方法來保存objectstates,但是Java給你提供一種應(yīng)該比你自己好的保存對(duì)象狀態(tài)的機(jī)制,那就是序列化。
- 序列化:將Java對(duì)象轉(zhuǎn)換成字節(jié)流的過程。
- 反序列化:將字節(jié)流轉(zhuǎn)換成Java對(duì)象的過程。
- 當(dāng)Java對(duì)象需要在網(wǎng)絡(luò)上傳輸或者持久化存儲(chǔ)到文件中時(shí),就需要對(duì)Java對(duì)象進(jìn)行序列化處理。
- 序列化的實(shí)現(xiàn):類實(shí)現(xiàn)Serializable接口,這個(gè)接口沒有需要實(shí)現(xiàn)的方法。實(shí)現(xiàn)Serializable接口是為了告訴jvm這個(gè)類的對(duì)象可以被序列化。
二、什么時(shí)候用序列化?
- 當(dāng)你想把的內(nèi)存中的對(duì)象狀態(tài)保存到一個(gè)文件中或者數(shù)據(jù)庫中時(shí)候;
- 當(dāng)你想用套接字在網(wǎng)絡(luò)上傳送對(duì)象的時(shí)候;
- 當(dāng)你想通過RMI傳輸對(duì)象的時(shí)候。
三、項(xiàng)目創(chuàng)建很多對(duì)象怎么優(yōu)化?
場景:
- 當(dāng)一個(gè)類存在繼承關(guān)系時(shí),你創(chuàng)建一個(gè)子類的對(duì)象時(shí),如果在沒有明確指定的情況下,子類是會(huì)隱式的去調(diào)用父類的無參構(gòu)造的。假設(shè),我們需要頻繁創(chuàng)建的對(duì)象,是一個(gè)繼承關(guān)系比較深的類的話,調(diào)用構(gòu)造函數(shù)的開銷不容小窺。
- 如果一時(shí)間內(nèi),頻繁創(chuàng)建某對(duì)象時(shí),這些平時(shí)不顯眼的消耗一疊加起來,就變得很客觀了。但是,當(dāng)我們使用clone的話,就可以避免這個(gè)問題。
- 大數(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)文章
Springboot+netty實(shí)現(xiàn)Web聊天室
這篇文章主要介紹了利用springboot+netty實(shí)現(xiàn)一個(gè)簡單Web聊天室,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-12-12
java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決
這篇文章主要介紹了java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
java中servlet實(shí)現(xiàn)登錄驗(yàn)證的方法
做web開發(fā),登錄驗(yàn)證是免不了的,今天學(xué)習(xí)了servlet的登錄驗(yàn)證,當(dāng)然是很簡單的,沒有使用session,request等作用域?qū)ο?,所以還是可以直接通過地址訪問網(wǎng)頁的。2013-05-05
java通過HttpServletRequest獲取post請(qǐng)求中的body內(nèi)容的方法
本篇文章主要介紹了java通過HttpServletRequest獲取post請(qǐng)求中的body內(nèi)容的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
一篇文章學(xué)會(huì)java死鎖與CPU 100%的排查
這篇文章主要介紹了一篇文章學(xué)會(huì)java死鎖與CPU 100%的排查,文中主要介紹了Java死鎖以及服務(wù)器CPU占用率達(dá)到100%時(shí)的排查和解決方法,感興趣的朋友一起來看一看吧2021-08-08
eclipse實(shí)現(xiàn)可認(rèn)證的DH密鑰交換協(xié)議
這篇文章主要介紹了eclipse實(shí)現(xiàn)可認(rèn)證的DH密鑰交換協(xié)議,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
java 輸入一個(gè)數(shù)字,反轉(zhuǎn)輸出這個(gè)數(shù)字的值(實(shí)現(xiàn)方法)
下面小編就為大家?guī)硪黄猨ava 輸入一個(gè)數(shù)字,反轉(zhuǎn)輸出這個(gè)數(shù)字的值(實(shí)現(xiàn)方法)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10
java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼
這篇文章主要介紹了java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
淺談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別
下面小編就為大家?guī)硪黄獪\談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08

