91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

實(shí)現(xiàn)序列化和反序列化為什么要實(shí)現(xiàn)Serializable接口

Android編程精選 ? 來(lái)源:CSDN ? 作者:椰子Tyshawn ? 2022-07-12 11:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

做服務(wù)化,需要把所有model包里的類(lèi)都實(shí)現(xiàn)Serializable接口, 同時(shí)還要顯示指定serialVersionUID的值。聽(tīng)到這個(gè)需求,我腦海里就突然出現(xiàn)了好幾個(gè)問(wèn)題,比如說(shuō):

序列化和反序列化

序列化:把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱(chēng)為對(duì)象的序列化。

反序列化:把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱(chēng)為對(duì)象的反序列化。

什么時(shí)候需要用到序列化和反序列化呢?

當(dāng)我們只在本地JVM里運(yùn)行下Java實(shí)例,這個(gè)時(shí)候是不需要什么序列化和反序列化的, 但當(dāng)我們需要將內(nèi)存中的對(duì)象持久化到磁盤(pán), 數(shù)據(jù)庫(kù)中時(shí),當(dāng)我們需要與瀏覽器進(jìn)行交互時(shí), 當(dāng)我們需要實(shí)現(xiàn)RPC時(shí),這個(gè)時(shí)候就需要序列化和反序列化了。

前兩個(gè)需要用到序列化和反序列化的場(chǎng)景,是不是讓我們有一個(gè)很大的疑問(wèn)? 我們?cè)谂c瀏覽器交互時(shí),還有將內(nèi)存中的對(duì)象持久化到數(shù)據(jù)庫(kù)中時(shí),好像都沒(méi)有去進(jìn)行序列化和反序列化,因?yàn)槲覀兌紱](méi)有實(shí)現(xiàn)Serializable接口, 但一直正常運(yùn)行。

下面先給出結(jié)論:

只要我們對(duì)內(nèi)存中的對(duì)象進(jìn)行持久化或網(wǎng)絡(luò)傳輸, 這個(gè)時(shí)候都需要序列化和反序列化.

理由:

服務(wù)器與瀏覽器交互時(shí)真的沒(méi)有用到Serializable接口嗎? JSON格式實(shí)際上就是將一個(gè)對(duì)象轉(zhuǎn)化為字符串, 所以服務(wù)器與瀏覽器交互時(shí)的數(shù)據(jù)格式其實(shí)是字符串, 我們來(lái)看來(lái)String類(lèi)型的源碼:

poYBAGLM5WaAeyVsAADlsXQGlkM013.jpg

String類(lèi)型實(shí)現(xiàn)了Serializable接口,并顯示指定serialVersionUID的值。

然后我們?cè)賮?lái)看對(duì)象持久化到數(shù)據(jù)庫(kù)中時(shí)的情況,Mybatis數(shù)據(jù)庫(kù)映射文件里的insert代碼:

pYYBAGLM5X6AeU3SAABSix10Bbk078.jpg

實(shí)際上我們并不是將整個(gè)對(duì)象持久化到數(shù)據(jù)庫(kù)中, 而是將對(duì)象中的屬性持久化到數(shù)據(jù)庫(kù)中, 而這些屬性都是實(shí)現(xiàn)了Serializable接口的基本屬性。

實(shí)現(xiàn)序列化和反序列化為什么要實(shí)現(xiàn)Serializable接口?

在Java中實(shí)現(xiàn)了Serializable接口后,JVM會(huì)在底層幫我們實(shí)現(xiàn)序列化和反序列化, 如果我們不實(shí)現(xiàn)Serializable接口, 那自己去寫(xiě)一套序列化和反序列化代碼也行, 至于具體怎么寫(xiě), Google一下你就知道了。

實(shí)現(xiàn)Serializable接口就算了, 為什么還要顯示指定serialVersionUID的值?

如果不顯示指定serialVersionUID,JVM在序列化時(shí)會(huì)根據(jù)屬性自動(dòng)生成一個(gè)serialVersionUID, 然后與屬性一起序列化,再進(jìn)行持久化或網(wǎng)絡(luò)傳輸. 在反序列化時(shí),JVM會(huì)再根據(jù)屬性自動(dòng)生成一個(gè)新版serialVersionUID,然后將這個(gè)新版serialVersionUID與序列化時(shí)生成的舊版serialVersionUID進(jìn)行比較, 如果相同則反序列化成功, 否則報(bào)錯(cuò).

如果顯示指定了serialVersionUID, JVM在序列化和反序列化時(shí)仍然都會(huì)生成一個(gè)serialVersionUID, 但值為我們顯示指定的值, 這樣在反序列化時(shí)新舊版本的serialVersionUID就一致了。

在實(shí)際開(kāi)發(fā)中, 不顯示指定serialVersionUID的情況會(huì)導(dǎo)致什么問(wèn)題? 如果我們的類(lèi)寫(xiě)完后不再修改, 那當(dāng)然不會(huì)有問(wèn)題, 但這在實(shí)際開(kāi)發(fā)中是不可能的,我們的類(lèi)會(huì)不斷迭代, 一旦類(lèi)被修改了,那舊對(duì)象反序列化就會(huì)報(bào)錯(cuò). 所以在實(shí)際開(kāi)發(fā)中, 我們都會(huì)顯示指定一個(gè)serialVersionUID, 值是多少無(wú)所謂, 只要不變就行。

寫(xiě)個(gè)實(shí)例測(cè)試下:

User類(lèi)

不顯示指定serialVersionUID.

poYBAGLM5bmATDjoAADE3tBVFuI262.jpg

poYBAGLM5cKARs6HAABKja56wSg415.jpg

測(cè)試類(lèi)

先進(jìn)行序列化, 再進(jìn)行反序列化.

pYYBAGLM5fGADpVAAAGAgrSz_mw962.jpg

pYYBAGLM5fmAEUlsAAA8Wgz1H6o479.jpg

結(jié)果

先注釋掉反序列化代碼,執(zhí)行序列化代碼,然后User類(lèi)新增一個(gè)屬性sex。

pYYBAGLM5iWAZJxyAADVZJJr1Bw657.jpg

pYYBAGLM5i2ACbSAAACcP1Hf3Dg941.jpg

再注釋掉序列化代碼執(zhí)行反序列化代碼,最后結(jié)果如下:

序列化前的結(jié)果: User{name='tyshawn', age=18}Exception in thread "main" java.io.InvalidClassException: org.tyshawn.SerializeAndDeserialize.User; local class incompatible: stream classdesc serialVersionUID = 1035612825366363028, local class serialVersionUID = -1830850955895931978報(bào)錯(cuò)結(jié)果為序列化與反序列化產(chǎn)生的serialVersionUID不一致。

接下來(lái)我們?cè)谏厦鎁ser類(lèi)的基礎(chǔ)上顯示指定一個(gè)serialVersionUID。

poYBAGLM5lmALd2xAAAeVtahAXk183.jpg

再執(zhí)行上述步驟, 測(cè)試結(jié)果如下:

poYBAGLM5miAFVtCAABGruQrwYg110.jpg

顯示指定serialVersionUID后就解決了序列化與反序列化產(chǎn)生的serialVersionUID不一致的問(wèn)題。

Java序列化的其他特性

先說(shuō)結(jié)論, 被transient關(guān)鍵字修飾的屬性不會(huì)被序列化, static屬性也不會(huì)被序列化。

我們來(lái)測(cè)試下這個(gè)結(jié)論:

User類(lèi)

poYBAGLM5qaADmAWAAEkCBKh5h4352.jpg

pYYBAGLM5q6AIREwAAETOQGRbiE266.jpg

測(cè)試類(lèi)

pYYBAGLM5uKAUZX_AAGU7j52Bic863.jpg

poYBAGLM5uiAQ0aVAAA7LL1_O6Y789.jpg

結(jié)果

先注釋掉反序列化代碼, 執(zhí)行序列化代碼, 然后修改User類(lèi)signature = “我的眼里只有你”, 再注釋掉序列化代碼執(zhí)行反序列化代碼, 最后結(jié)果如下:

poYBAGLM5v-ALZ49AAB0bxxmfIk875.jpg

static屬性為什么不會(huì)被序列化?

因?yàn)樾蛄谢轻槍?duì)對(duì)象而言的,而static屬性?xún)?yōu)先于對(duì)象存在,隨著類(lèi)的加載而加載, 所以不會(huì)被序列化。

看到這個(gè)結(jié)論,是不是有人會(huì)問(wèn),serialVersionUID也被static修飾,為什么serialVersionUID會(huì)被序列化? 其實(shí)serialVersionUID屬性并沒(méi)有被序列化,JVM在序列化對(duì)象時(shí)會(huì)自動(dòng)生成一個(gè)serialVersionUID,然后將我們顯示指定的serialVersionUID屬性值賦給自動(dòng)生成的serialVersionUID。

審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9521

    瀏覽量

    157041
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3001

    瀏覽量

    116439
  • RPC
    RPC
    +關(guān)注

    關(guān)注

    0

    文章

    114

    瀏覽量

    12265

原文標(biāo)題:Java 序列化和反序列化,為什么要實(shí)現(xiàn) Serializable 接口?

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    JSON:簡(jiǎn)潔代碼高效搞定序列化反序列化

    面對(duì)頻繁的數(shù)據(jù)交互需求,用最簡(jiǎn)方式實(shí)現(xiàn)JSON序列化反序列化已成為開(kāi)發(fā)者必備技能,借助主流庫(kù),輕松實(shí)現(xiàn)零負(fù)擔(dān)數(shù)據(jù)轉(zhuǎn)換。JSON(JavaScriptObjectNotation)是一
    的頭像 發(fā)表于 02-25 19:04 ?95次閱讀
    JSON:簡(jiǎn)潔代碼高效搞定<b class='flag-5'>序列化</b>與<b class='flag-5'>反序列化</b>

    IO序列化操作:提升系統(tǒng)互操作性的關(guān)鍵技術(shù)

    在異構(gòu)系統(tǒng)并存的今天,IO序列化操作成為實(shí)現(xiàn)系統(tǒng)間互操作性的核心技術(shù)。通過(guò)標(biāo)準(zhǔn)的數(shù)據(jù)格式(如JSON、Protobuf、Hessian等),不同語(yǔ)言、平臺(tái)的系統(tǒng)得以無(wú)縫交換信息。合理設(shè)計(jì)序列
    的頭像 發(fā)表于 02-25 16:02 ?57次閱讀
    IO<b class='flag-5'>序列化</b>操作:提升系統(tǒng)互操作性的關(guān)鍵技術(shù)

    【ioqueue】 IO序列化操作全解析

    從內(nèi)存對(duì)象到可存儲(chǔ)或可傳輸?shù)淖止?jié)流,IO序列化操作完成了數(shù)據(jù)形態(tài)的轉(zhuǎn)化。這一過(guò)程不僅涉及編碼與解碼邏輯,還需處理版本兼容、安全性與性能開(kāi)銷(xiāo)等問(wèn)題。全面掌握這一技術(shù)路徑,有助于構(gòu)建更加健壯的應(yīng)用系統(tǒng)
    的頭像 發(fā)表于 02-24 19:22 ?88次閱讀
    【ioqueue】 IO<b class='flag-5'>序列化</b>操作全解析

    極簡(jiǎn)代碼,搞定JSON序列化反序列化

    快速實(shí)現(xiàn)JSON數(shù)據(jù)的生成(序列化)與解析(反序列化)。 目前json庫(kù)已全面支持LuatOS開(kāi)發(fā)系列產(chǎn)品,開(kāi)發(fā)者可根據(jù)項(xiàng)目實(shí)際需求,靈活選用并進(jìn)行快速集成與開(kāi)發(fā)。 一、 JSON基礎(chǔ)要點(diǎn) 在
    的頭像 發(fā)表于 02-23 21:46 ?332次閱讀
    極簡(jiǎn)代碼,搞定JSON<b class='flag-5'>序列化</b>與<b class='flag-5'>反序列化</b>

    深入剖析LMH0030:SMPTE標(biāo)準(zhǔn)數(shù)字視頻序列化器的卓越之選

    深入剖析LMH0030:SMPTE標(biāo)準(zhǔn)數(shù)字視頻序列化器的卓越之選 在當(dāng)今數(shù)字的時(shí)代,數(shù)字視頻處理技術(shù)日新月異。對(duì)于電子工程師而言,選擇一款性能卓越、功能豐富的數(shù)字視頻序列化器至關(guān)重要。今天,我們
    的頭像 發(fā)表于 12-30 14:00 ?291次閱讀

    深入解析LM2512A:高性能RGB顯示接口序列化

    深入解析LM2512A:高性能RGB顯示接口序列化器 在電子設(shè)備的顯示領(lǐng)域,如何高效、穩(wěn)定地傳輸高質(zhì)量的圖像數(shù)據(jù)是一個(gè)關(guān)鍵問(wèn)題。TI的LM2512A作為一款專(zhuān)門(mén)的移動(dòng)像素鏈路(MPL - 1)24位
    的頭像 發(fā)表于 12-26 11:30 ?416次閱讀

    SN65HVS885:工業(yè)自動(dòng)的理想數(shù)字輸入序列化

    SN65HVS885:工業(yè)自動(dòng)的理想數(shù)字輸入序列化器 在工業(yè)和建筑自動(dòng)領(lǐng)域,對(duì)于高通道密度數(shù)字輸入模塊的需求日益增長(zhǎng)。德州儀器(TI)的SN65HVS885作為一款八通道數(shù)字輸入序列化
    的頭像 發(fā)表于 12-25 11:00 ?445次閱讀

    深度解析DS90UH929-Q1:720p HDMI 到 FPD-Link III 橋接序列化

    深度解析DS90UH929-Q1:720p HDMI 到 FPD-Link III 橋接序列化器 在電子工程師的日常工作中,選擇一款合適的器件來(lái)實(shí)現(xiàn)特定功能至關(guān)重要。今天,我們聚焦于德州儀器(TI
    的頭像 發(fā)表于 12-22 15:50 ?356次閱讀

    DS90UH947-Q1:1080p OpenLDI至FPD - Link III序列化器的深度解析

    DS90UH947-Q1:1080p OpenLDI 至 FPD - Link III 序列化器的深度解析 在當(dāng)今的電子設(shè)備領(lǐng)域,視頻傳輸技術(shù)的發(fā)展日新月異,對(duì)于高質(zhì)量、高速率視頻傳輸?shù)男枨笠苍絹?lái)越
    的頭像 發(fā)表于 12-22 15:40 ?328次閱讀

    輕量級(jí)參數(shù)的管理框架(C語(yǔ)言)

    反序列化操作。 方便在本地儲(chǔ)存設(shè)備(如flash、eeprom等)保存/讀取二進(jìn)制數(shù)據(jù),甚至還可以跨設(shè)備傳輸使用 提供了兩種方式: 第一種:只需要提供參數(shù)數(shù)據(jù)保存/加載的回調(diào)函數(shù),調(diào)用相關(guān)接口函數(shù)
    發(fā)表于 12-16 06:24

    TaskPool和Worker的對(duì)比分析

    TaskPoolWorker內(nèi)存模型線程間隔離,內(nèi)存不共享。線程間隔離,內(nèi)存不共享。 參數(shù)傳遞機(jī)制采用標(biāo)準(zhǔn)的結(jié)構(gòu)克隆算法(Structured Clone)進(jìn)行序列化、反序列化,完成參數(shù)傳遞。 支持ArrayBuffer
    發(fā)表于 06-18 06:43

    鴻蒙5開(kāi)發(fā)寶藏案例分享---跨線程性能優(yōu)化指南

    , bookList); // 卡在主線程序列化! 改造后 (<8ms): // 關(guān)鍵:實(shí)現(xiàn)Sendable接口! class Book implements Sendable
    發(fā)表于 06-12 17:13

    快手上線鴻蒙應(yīng)用高性能解決方案:數(shù)據(jù)反序列化性能提升90%

    普通對(duì)象(如 JSON 數(shù)據(jù))與類(lèi)實(shí)例進(jìn)行互轉(zhuǎn),是實(shí)現(xiàn)面向?qū)ο缶幊膛c數(shù)據(jù)序列化解耦的核心工具。隨著業(yè)務(wù)復(fù)雜度的提升,該庫(kù)在反序列化過(guò)程中逐漸暴露出性能瓶頸,影響用戶(hù)核心體驗(yàn)。因此
    發(fā)表于 05-15 10:01

    spartan 6 14位LVDS 反序列化

    spartan 6系列的FPGA 與14位ADC 輸出LVDS信號(hào) 怎么實(shí)現(xiàn)1:14的串轉(zhuǎn)并呢?iserdes2 在ise里面最高只能實(shí)現(xiàn)8位啊
    發(fā)表于 04-25 15:20

    什么是SerDes?SerDes有哪些應(yīng)用?

    SerDes是一種功能塊,用于對(duì)高速芯片間通信中使用的數(shù)字數(shù)據(jù)進(jìn)行序列化反序列化。用于高性能計(jì)算(HPC)、人工智能(AI)、汽車(chē)、移動(dòng)和物聯(lián)網(wǎng)(IoT)應(yīng)用的現(xiàn)代片上系統(tǒng)(SoC)都實(shí)現(xiàn)
    的頭像 發(fā)表于 03-27 16:18 ?6335次閱讀
    什么是SerDes?SerDes有哪些應(yīng)用?