欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Java中的實(shí)體類要?implements?Serializable的原因分析

 更新時(shí)間:2023年06月21日 11:01:11   作者:奮豆來(lái)襲  
這篇文章主要介紹了Java中的實(shí)體類為什么要?implements?Serializable,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1. 序列化和反序列化

首先來(lái)解釋一下什么是序列化和反序列化:

序列化:把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化。
反序列化:把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化。

  • 在 Java 和其他語(yǔ)言進(jìn)行通信的時(shí)候,需要將對(duì)象轉(zhuǎn)化成一種通用的格式例如Json( 轉(zhuǎn)換成大家都認(rèn)識(shí)的對(duì)象 ),從對(duì)象到 Json 字符串的轉(zhuǎn)換過(guò)程就是序列化的過(guò)程,反過(guò)來(lái), 從 Json 字符串轉(zhuǎn)換成 Java 對(duì)象的過(guò)程就是反序列化的過(guò)程。
  • 當(dāng) Java 需要把一個(gè)對(duì)象的狀態(tài)保存到文件或者是數(shù)據(jù)庫(kù)的時(shí)候,就是數(shù)據(jù)存取的過(guò)程中的中間過(guò)程,就需要序列化。我們可以把序列化的過(guò)程理解為 "freeze",它將一個(gè) Java 對(duì)象 freeze,然后進(jìn)行存儲(chǔ);等到再次需要的時(shí)候,再將這個(gè)對(duì)象 "de-freeze" 就能使用了。

2. 為什么要 implements Serialzable?

  • 一個(gè)類只有實(shí)現(xiàn)了 Serializable 接口,它的對(duì)象才是可序列化的。因此如果要序列化某些類的對(duì)象,這些類就必須實(shí)現(xiàn) Serializable 接口。而實(shí)際上,Serializable 的源碼是一個(gè)空接口,沒(méi)有什么具體內(nèi)容,它的目的只是簡(jiǎn)單的標(biāo)識(shí)一個(gè)類的對(duì)象可以被序列化。
  • serialization 允許你將實(shí)現(xiàn)了 Serializable 接口的對(duì)象轉(zhuǎn)換為字節(jié)序列,這些字節(jié)序列可以被完全存儲(chǔ)以備以后重新生成原來(lái)的對(duì)象。

3. 那么什么情況下需要實(shí)現(xiàn)序列化?

  • 把內(nèi)存中的對(duì)象寫入到硬盤。例如,你的內(nèi)存不夠用了,那計(jì)算機(jī)就要將內(nèi)存里面的一部分對(duì)象暫時(shí)的保存到硬盤中,等到要用的時(shí)候再讀入到內(nèi)存中,硬盤的那部分存儲(chǔ)空間就是所謂的虛擬內(nèi)存。再例如,你要將某個(gè)特定的對(duì)象保存到文件中,隔幾天在把它拿出來(lái)用,那么這時(shí)候就需要實(shí)現(xiàn) Serializable 接口。
  • 使用套接字在網(wǎng)絡(luò)上傳送對(duì)象,通常情況下你可以在 server 端用獲取 socket 的 outputstream inputstream,將取得的數(shù)據(jù)處理成字符串發(fā)送到客戶端,然后在客戶端拆分字符串,但是這樣顯然會(huì)降低效率,于是你可以將 server 端數(shù)據(jù) 包裝 成一個(gè) class implements Serializable,然后直接用objectoutputstream,objectinputstream 直接傳遞。
  • 通過(guò) Java的 RIM(remote method invocation)傳輸對(duì)象。RMI 允許對(duì)象在本機(jī)上可以一樣操作遠(yuǎn)程機(jī)器上的對(duì)象。當(dāng)發(fā)送消息給遠(yuǎn)程對(duì)象時(shí),就需要用到 serializaiton 機(jī)制來(lái)發(fā)送參數(shù)和接收返回值。

實(shí)體類實(shí)現(xiàn)序列化的目的:

  • 一是便于存儲(chǔ)
  • 二是便于傳輸

像 boolean 、int、long 類型等,都是基本數(shù)據(jù)類型,數(shù)據(jù)庫(kù)里面有與之對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)。從類聲明來(lái)看,我們以為的沒(méi)有進(jìn)行序列化,其實(shí)是在聲明各個(gè)不同變量的時(shí)候,由具體的數(shù)據(jù)類型幫助我們實(shí)現(xiàn)了序列化操作。所以就算我們不實(shí)現(xiàn) serializable 依舊可以正常操作。

如果平時(shí)留意的話,我們會(huì)發(fā)現(xiàn)序列化操作用于存儲(chǔ)時(shí),一般是對(duì)于 NoSql 數(shù)據(jù)庫(kù),而在使用 Nosql 數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)時(shí),如 redis,它就沒(méi)有 varchar,int 之類的數(shù)據(jù)結(jié)構(gòu)。 而在沒(méi)有的情況下,我們又確實(shí)需要進(jìn)行存儲(chǔ),那么我們就需要將對(duì)象進(jìn)行序列化。

4. 為什么要顯示聲明 serialVersionUID

serialVersionUID 的作用是驗(yàn)證序列化和反序列化的過(guò)程中,對(duì)象是否保持一致。所以在一般情況下我們需要顯示的聲明serialVersionUID。如果接受者加載的該對(duì)象的類的 serialVersionUID 和發(fā)送者的類版本號(hào)不同的話,反序列化會(huì)爆出 InvalidClassException 錯(cuò)誤。

什么時(shí)候會(huì)導(dǎo)致報(bào)出這個(gè)錯(cuò)誤呢?例如在沒(méi)有顯示聲明版本號(hào)的時(shí)候,先將對(duì)象進(jìn)行了序列化;然后不管出于什么目的,該對(duì)象的類被修改了,哪怕僅僅是添加了一個(gè)強(qiáng)制轉(zhuǎn)換,或者將一個(gè) public 的屬性給私有化了,都會(huì)影響版本號(hào)。此時(shí)在這個(gè)環(huán)境下用反序列化的方法讀取以前序列化之后存儲(chǔ)起來(lái)的對(duì)象是會(huì)報(bào)錯(cuò)的。

@Data
public class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId("id")
    private Integer id;
    @TableField("name")
    private String name;
    @TableField("age")
    private Integer age;
}

到此這篇關(guān)于Java中的實(shí)體類為什么要 implements Serializable?的文章就介紹到這了,更多相關(guān)Java實(shí)體類 implements Serializable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)簡(jiǎn)單的RPC框架的示例代碼

    Java實(shí)現(xiàn)簡(jiǎn)單的RPC框架的示例代碼

    本篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單的RPC框架的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • 手把手寫Spring框架

    手把手寫Spring框架

    Spring是于2003 年興起的一個(gè)輕量級(jí)的Java 開(kāi)發(fā)框架,由Rod Johnson創(chuàng)建。簡(jiǎn)單來(lái)說(shuō),Spring是一個(gè)分層的JavaSE/EE full-stack(一站式) 輕量級(jí)開(kāi)源框架
    2021-08-08
  • java異常處理攔截器詳情

    java異常處理攔截器詳情

    這篇文章主要介紹了java異常處理攔截器,使用異常處理攔截器,可以不用寫那么多try…catch…,下面就來(lái)學(xué)習(xí)關(guān)于java異常處理攔截器的詳情內(nèi)容吧,需要的朋友可以參考一下
    2021-10-10
  • java并發(fā)編程之原子性、可見(jiàn)性、有序性

    java并發(fā)編程之原子性、可見(jiàn)性、有序性

    這篇文章主要給大家分享的是java并發(fā)編程的原子性、可見(jiàn)性和有序性,文章會(huì)具體舉例說(shuō)明,感興趣的小伙伴可以參考一下文章的具體內(nèi)容
    2021-09-09
  • SpringBoot Security實(shí)現(xiàn)單點(diǎn)登出并清除所有token

    SpringBoot Security實(shí)現(xiàn)單點(diǎn)登出并清除所有token

    Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問(wèn)控制框架。提供了完善的認(rèn)證機(jī)制和方法級(jí)的授權(quán)功能。是一款非常優(yōu)秀的權(quán)限管理框架。它的核心是一組過(guò)濾器鏈,不同的功能經(jīng)由不同的過(guò)濾器
    2023-01-01
  • 使用resty Quartz執(zhí)行定時(shí)任務(wù)的配置方法

    使用resty Quartz執(zhí)行定時(shí)任務(wù)的配置方法

    這篇文章主要為大家介紹了使用resty?Quartz來(lái)執(zhí)行定時(shí)任務(wù)的配置方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • idea如何指定MainClass

    idea如何指定MainClass

    文章介紹了如何在IntelliJ IDEA中設(shè)置Java后臺(tái)測(cè)試程序的MainClass,并分享了設(shè)置JDK版本和Project language level的方法
    2024-11-11
  • Java多線程并發(fā)FutureTask使用詳解

    Java多線程并發(fā)FutureTask使用詳解

    Java?的多線程機(jī)制本質(zhì)上能夠完成兩件事情,異步計(jì)算和并發(fā),F(xiàn)utureTask?是基于?Runnable?實(shí)現(xiàn)的一個(gè)可取消的異步調(diào)用?API,本文給大家介紹Java?多線程并發(fā)FutureTask及基本使用,需要的朋友可以參考下
    2022-06-06
  • springboot多環(huán)境進(jìn)行動(dòng)態(tài)配置的方法

    springboot多環(huán)境進(jìn)行動(dòng)態(tài)配置的方法

    這篇文章主要介紹了springboot多環(huán)境下如何進(jìn)行動(dòng)態(tài)配置,本文主要分享了如何在springboot的項(xiàng)目中使用多環(huán)境配置,重點(diǎn)是”spring.profiles.active“屬性,需要的朋友可以參考下
    2022-06-06
  • 一文掌握J(rèn)ava開(kāi)發(fā)工具M(jìn)aven(簡(jiǎn)單上手)

    一文掌握J(rèn)ava開(kāi)發(fā)工具M(jìn)aven(簡(jiǎn)單上手)

    掌握maven的相關(guān)知識(shí)是Java開(kāi)發(fā)必備的技能,今天通過(guò)本文從入門安裝開(kāi)始,逐步深入講解maven的相關(guān)知識(shí),包括maven的安裝到簡(jiǎn)單上手maven項(xiàng)目開(kāi)發(fā),感興趣的朋友跟隨小編一起看看吧
    2021-06-06

最新評(píng)論