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

Java序列化原理詳解

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

前言

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

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

以上拋出了幾個問題,大家都能回答上來嗎?回答不上來的話就接著往下看吧。

前提知識:

講解之前先擴充一些前提知識。

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

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

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

文本協(xié)議

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

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

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

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ù),比如一張圖片。

二進制協(xié)議

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

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

序列化

首先讓百度來解釋一下什么是序列化:

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

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

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

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

以上都涉及到了序列化。

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

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

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

java中serialVersionUID 不能改變的原因是避免反序列失敗,可能會拋出序列化運行時異常。

Java序列化缺陷

實際工作中會發(fā)現(xiàn)我們自己很少會使用java提供的序列化,主要是因為JDK默認的序列化存在著一些非常嚴重的缺陷,比如它是無法實現(xiàn)跨平臺和跨語言的,意思是我們在java中序列化的對象是無法被其他語言或者是被瀏覽器反序列的。

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

JSON

看下定義:

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

我們在后端將需要返回的數(shù)據(jù)通過json處理成json字符串后轉(zhuǎn)為二進制在網(wǎng)絡(luò)中傳輸,瀏覽器會解析為json字符串,進而我們可以再通過json將json字符串轉(zhuǎn)換為對象。

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

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

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

深拷貝

提供幾種Java對象深拷貝方案:

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

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

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

上面我們可以通過json序列化的方式進行對象深拷貝,下面再提供一種使用二進制序列化的方式進行List<對象>深拷貝的實現(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決IDEA?2022?Translation?翻譯文檔失敗:?未知錯誤的問題

    解決IDEA?2022?Translation?翻譯文檔失敗:?未知錯誤的問題

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

    軟件開發(fā)七大過程模型

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

    Java中@RestController注解使用

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

    spring boot 圖片上傳與顯示功能實例詳解

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

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

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

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

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

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

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

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

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

    Spring中的PathVariable注釋解析

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

    詳細解讀Java的串口編程

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

最新評論

攀枝花市| 广元市| 九寨沟县| 漠河县| 玉山县| 获嘉县| 阿瓦提县| 寿阳县| 大理市| 南和县| 长乐市| 宁远县| 德清县| 滁州市| 邛崃市| 灌阳县| 读书| 古交市| 崇明县| 白城市| 中西区| 夹江县| 庄浪县| 满城县| 鲁甸县| 晋宁县| 宁南县| 霍邱县| 略阳县| 舟曲县| 宁强县| 松溪县| 临汾市| 洛阳市| 海门市| 米易县| 平罗县| 都匀市| 康乐县| 厦门市| 津市市|