最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java序列化原理詳解

 更新時(shí)間:2022年06月30日 09:03:01   作者:??張國(guó)榮南京分榮????  
這篇文章主要介紹了Java序列化原理詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下

前言

關(guān)于序列化的幾種疑問(wèn)?

  • 什么是序列化?工作中什么時(shí)候用到序列化了?
  • 為什么實(shí)現(xiàn)了java.io.Serializable接口就能序列化?
  • java中serialVersionUID 為什么不能改變?
  • Serializable序列化和json序列化有什么關(guān)系?
  • 你都會(huì)哪幾種對(duì)象深拷貝方式?

以上拋出了幾個(gè)問(wèn)題,大家都能回答上來(lái)嗎?回答不上來(lái)的話就接著往下看吧。

前提知識(shí):

講解之前先擴(kuò)充一些前提知識(shí)。

二進(jìn)制協(xié)議和文本協(xié)議

首先我們要知道所有的數(shù)據(jù)在底層的傳輸都是二進(jìn)制流,這點(diǎn)是毋庸置疑的。

那什么是文本協(xié)議?什么是二進(jìn)制協(xié)議呢?

文本協(xié)議

文本協(xié)議一般是由一串ACSII字符組成的數(shù)據(jù),這些字符包括數(shù)字,大小寫(xiě)字母、百分號(hào),還有回車(\r),換行(\n)以及空格等等。

文本協(xié)議設(shè)計(jì)的目的就是方便人們理解、讀懂,所以,協(xié)議中通常會(huì)加入一些特殊字符用于分隔。

比如日常中發(fā)送請(qǐng)求時(shí)經(jīng)常用到的方式: xmljsonformData,他們雖然格式不同,但都有一個(gè)特征,自帶描述信息。

formData 31bytes

account=sqrtcat&password=123456

json 41bytes

{"account":"sqrtcat","password":"123456"}

xml 94bytes

<?xml version="1.0" encoding="UTF-8" ?> <account>sqrtcat</account> <password>123456</password>

但為了便于解析,文本協(xié)議不得不添加一些冗余的字符用于分隔命令,降低了其傳輸?shù)男?;而且只適于傳輸文本,很難嵌入其他數(shù)據(jù),比如一張圖片。

二進(jìn)制協(xié)議

二進(jìn)制協(xié)議就是一串字節(jié)流,通常包括消息頭(header)和消息體(body),消息頭的長(zhǎng)度固定,并且消息頭包括了消息體的長(zhǎng)度。這樣就能夠從數(shù)據(jù)流中解析出一個(gè)完整的二進(jìn)制數(shù)據(jù)。

二進(jìn)制協(xié)議,沒(méi)有冗余字段,傳輸高效,方便解析(固定長(zhǎng)度,并且可以直接比較字節(jié)),缺點(diǎn)就是定義的比較死,哪個(gè)位置有哪些東西,是什么意義是定義死的,場(chǎng)景單一。

序列化

首先讓百度來(lái)解釋一下什么是序列化:

序列化 是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程。在序列化期間,對(duì)象將其當(dāng)前狀態(tài)寫(xiě)入到臨時(shí)或持久性存儲(chǔ)區(qū)。之后,可以通過(guò)從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài),重新創(chuàng)建該對(duì)象。

那我們工作中什么時(shí)候用到序列化了?

在創(chuàng)建一個(gè)Java類時(shí)實(shí)現(xiàn)java.io.Serializable接口,將你的對(duì)象進(jìn)行網(wǎng)絡(luò)傳輸或者持久化;

使用spring注解@ResponseBody或者使用JSON框架(jackson、Gson、fastjson)等給前端返回json數(shù)據(jù)。

以上都涉及到了序列化。

為什么實(shí)現(xiàn)了java.io.Serializable接口就能序列化?

Java自己提供了一種序列化機(jī)制,這種機(jī)制能將一個(gè)對(duì)象序列化成二進(jìn)制形式,用于寫(xiě)入磁盤(pán)或輸出到網(wǎng)絡(luò),同時(shí)將從網(wǎng)絡(luò)或者磁盤(pán)中讀取的字節(jié)數(shù)組,反序列化成對(duì)象,在程序中使用。

便是實(shí)現(xiàn)java.io包下的Serializable接口,使用JDK 提供的兩個(gè)輸入、輸出流對(duì)象 ObjectInputStream 和 ObjectOutputStream便可以對(duì)java對(duì)象進(jìn)行序列化和反序列化。

java中serialVersionUID 不能改變的原因是避免反序列失敗,可能會(huì)拋出序列化運(yùn)行時(shí)異常。

Java序列化缺陷

實(shí)際工作中會(huì)發(fā)現(xiàn)我們自己很少會(huì)使用java提供的序列化,主要是因?yàn)镴DK默認(rèn)的序列化存在著一些非常嚴(yán)重的缺陷,比如它是無(wú)法實(shí)現(xiàn)跨平臺(tái)和跨語(yǔ)言的,意思是我們?cè)趈ava中序列化的對(duì)象是無(wú)法被其他語(yǔ)言或者是被瀏覽器反序列的。

為了解決這一問(wèn)題通常將Java對(duì)象轉(zhuǎn)換為XML或Json格式進(jìn)而實(shí)現(xiàn)網(wǎng)絡(luò)傳輸。

JSON

看下定義:

JSON(JavaScript Object Notation, JS對(duì)象簡(jiǎn)譜)是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于 ECMAScript(European Computer Manufacturers Association, 歐洲計(jì)算機(jī)協(xié)會(huì)制定的js規(guī)范)的一個(gè)子集,采用完全獨(dú)立于編程語(yǔ)言的文本格式來(lái)存儲(chǔ)和表示數(shù)據(jù)。簡(jiǎn)潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語(yǔ)言。 易于人閱讀和編寫(xiě),同時(shí)也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。它和xml一樣都是一種數(shù)據(jù)交換格式。

我們?cè)诤蠖藢⑿枰祷氐臄?shù)據(jù)通過(guò)json處理成json字符串后轉(zhuǎn)為二進(jìn)制在網(wǎng)絡(luò)中傳輸,瀏覽器會(huì)解析為json字符串,進(jìn)而我們可以再通過(guò)json將json字符串轉(zhuǎn)換為對(duì)象。

json 是?種很簡(jiǎn)潔的協(xié)議,但可惜的是,它只能傳遞基本的數(shù)型(int,long,string等),但不能傳遞byte類型。如果想要傳輸圖?等?進(jìn)制?件的話,是沒(méi)辦法直接傳輸。

json序列化在webapi項(xiàng)目中非常流行。因?yàn)閖son非常的直觀明了,調(diào)用者能夠很直觀的知道返回的數(shù)據(jù)信息。

二進(jìn)制序列化一般情況下數(shù)據(jù)大小會(huì)比xml,json的序列化的更小。但是二進(jìn)制則不能直觀的知道數(shù)據(jù)的內(nèi)容信息。

深拷貝

提供幾種Java對(duì)象深拷貝方案:

//1.構(gòu)造函數(shù)  《不推薦》
//2.implements Cloneable 重寫(xiě)clone()   《不推薦》
//3.序列化后反序列化	 《推薦》
// 使用Apache Commons Lang序列化進(jìn)行深拷貝
User copyUser = (User) SerializationUtils.clone(user);

// 使用Gson序列化進(jìn)行深拷貝
Gson gson = new Gson();
User copyUser = gson.fromJson(gson.toJson(user), User.class);

// 使用Jackson序列化進(jìn)行深拷貝
ObjectMapper objectMapper = new ObjectMapper();
User copyUser = objectMapper.readValue(objectMapper.writeValueAsString(user), User.class);

上面我們可以通過(guò)json序列化的方式進(jìn)行對(duì)象深拷貝,下面再提供一種使用二進(jìn)制序列化的方式進(jìn)行List<對(duì)象>深拷貝的實(shí)現(xiàn)方式:

    public static <T> List<T> copyList(List<T> source) {
        try {
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            out.writeObject(source);

            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
            ObjectInputStream inStream = new ObjectInputStream(byteIn);
            List<T> list = (List<T>) inStream.readObject();

            inStream.close();
            byteIn.close();
            out.close();
            byteOut.close();
            return list;
        } catch (Exception e) {
            log.info(e.getMessage(), e);
        }
        return null;
    }

到此這篇關(guān)于Java序列化原理詳解的文章就介紹到這了,更多相關(guān)Java序列化 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決IDEA?2022?Translation?翻譯文檔失敗:?未知錯(cuò)誤的問(wèn)題

    解決IDEA?2022?Translation?翻譯文檔失敗:?未知錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了IDEA?2022?Translation?翻譯文檔失敗:?未知錯(cuò)誤,本文較詳細(xì)的給大家介紹了IDEA?2022?Translation未知錯(cuò)誤翻譯文檔失敗的解決方法,需要的朋友可以參考下
    2022-04-04
  • 軟件開(kāi)發(fā)七大過(guò)程模型

    軟件開(kāi)發(fā)七大過(guò)程模型

    這篇文章主要介紹了Java七大過(guò)程模型詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java中@RestController注解使用

    Java中@RestController注解使用

    在Spring框架中,@RestController注解是一個(gè)非常重要的注解,它用于將一個(gè)類標(biāo)記為RESTful風(fēng)格的控制器,本文就來(lái)介紹一下Java中@RestController注解使用,感興趣的可以了解一下
    2023-11-11
  • spring boot 圖片上傳與顯示功能實(shí)例詳解

    spring boot 圖片上傳與顯示功能實(shí)例詳解

    這篇文章主要介紹了spring boot 圖片上傳與顯示功能實(shí)例詳解,需要的朋友可以參考下
    2017-04-04
  • Java 坐標(biāo)系相互轉(zhuǎn)換方式

    Java 坐標(biāo)系相互轉(zhuǎn)換方式

    這篇文章主要介紹了Java中的坐標(biāo)系相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 程序包org.springframework不存在的解決辦法

    程序包org.springframework不存在的解決辦法

    這篇文章主要介紹了程序包org.springframework不存在的解決辦法,在使用IDEA創(chuàng)建SpringBoot項(xiàng)目時(shí),剛打開(kāi)無(wú)法正常運(yùn)行,本文通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),具有一定參考價(jià)值,需要的朋友可以參考下
    2024-07-07
  • 輕松理解Java面試和開(kāi)發(fā)中的IoC(控制反轉(zhuǎn))

    輕松理解Java面試和開(kāi)發(fā)中的IoC(控制反轉(zhuǎn))

    在Java開(kāi)發(fā)中,IoC意 味著將你設(shè)計(jì)好的類交給系統(tǒng)去控制,而不是在你的類內(nèi)部控制。這稱為控制反轉(zhuǎn)。下文給大家介紹Java面試和開(kāi)發(fā)中的IoC(控制反轉(zhuǎn))知識(shí),需要的朋友參考下吧
    2017-07-07
  • Json在Struts中的轉(zhuǎn)換與傳遞方法

    Json在Struts中的轉(zhuǎn)換與傳遞方法

    下面小編就為大家?guī)?lái)一篇Json在Struts中的轉(zhuǎn)換與傳遞方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • Spring中的PathVariable注釋解析

    Spring中的PathVariable注釋解析

    這篇文章主要介紹了Spring中的PathVariable注釋用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳細(xì)解讀Java的串口編程

    詳細(xì)解讀Java的串口編程

    這篇文章主要介紹了詳細(xì)解讀Java的串口編程,而文中講解的示例主要針對(duì)于JavaComm和RxTx這兩個(gè)庫(kù),需要的朋友可以參考下
    2015-08-08

最新評(píng)論

孝义市| 河北省| 交口县| 利津县| 甘孜县| 达孜县| 息烽县| 嘉禾县| 南召县| 富裕县| 鄂温| 淳化县| 洞口县| 漳浦县| 五常市| 宕昌县| 原阳县| 南和县| 曲靖市| 新安县| 英吉沙县| 屏山县| 曲沃县| 巴南区| 烟台市| 麟游县| 平阳县| 体育| 怀化市| 河津市| 建阳市| 巧家县| 和顺县| 玉山县| 西盟| 兴化市| 慈利县| 米脂县| 山西省| 会昌县| 曲水县|