<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

實現序列化和反序列化為什么要實現Serializable接口

Android編程精選 ? 來源:CSDN ? 作者:椰子Tyshawn ? 2022-07-12 11:05 ? 次閱讀

做服務化,需要把所有model包里的類都實現Serializable接口, 同時還要顯示指定serialVersionUID的值。聽到這個需求,我腦海里就突然出現了好幾個問題,比如說:

序列化和反序列化

序列化:把對象轉換為字節序列的過程稱為對象的序列化。

反序列化:把字節序列恢復為對象的過程稱為對象的反序列化。

什么時候需要用到序列化和反序列化呢?

當我們只在本地JVM里運行下Java實例,這個時候是不需要什么序列化和反序列化的, 但當我們需要將內存中的對象持久化到磁盤, 數據庫中時,當我們需要與瀏覽器進行交互時, 當我們需要實現RPC時,這個時候就需要序列化和反序列化了。

前兩個需要用到序列化和反序列化的場景,是不是讓我們有一個很大的疑問? 我們在與瀏覽器交互時,還有將內存中的對象持久化到數據庫中時,好像都沒有去進行序列化和反序列化,因為我們都沒有實現Serializable接口, 但一直正常運行。

下面先給出結論:

只要我們對內存中的對象進行持久化或網絡傳輸, 這個時候都需要序列化和反序列化.

理由:

服務器與瀏覽器交互時真的沒有用到Serializable接口嗎? JSON格式實際上就是將一個對象轉化為字符串, 所以服務器與瀏覽器交互時的數據格式其實是字符串, 我們來看來String類型的源碼:

poYBAGLM5WaAeyVsAADlsXQGlkM013.jpg

String類型實現了Serializable接口,并顯示指定serialVersionUID的值。

然后我們再來看對象持久化到數據庫中時的情況,Mybatis數據庫映射文件里的insert代碼:

pYYBAGLM5X6AeU3SAABSix10Bbk078.jpg

實際上我們并不是將整個對象持久化到數據庫中, 而是將對象中的屬性持久化到數據庫中, 而這些屬性都是實現了Serializable接口的基本屬性。

實現序列化和反序列化為什么要實現Serializable接口?

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

實現Serializable接口就算了, 為什么還要顯示指定serialVersionUID的值?

如果不顯示指定serialVersionUID,JVM在序列化時會根據屬性自動生成一個serialVersionUID, 然后與屬性一起序列化,再進行持久化或網絡傳輸. 在反序列化時,JVM會再根據屬性自動生成一個新版serialVersionUID,然后將這個新版serialVersionUID與序列化時生成的舊版serialVersionUID進行比較, 如果相同則反序列化成功, 否則報錯.

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

在實際開發中, 不顯示指定serialVersionUID的情況會導致什么問題? 如果我們的類寫完后不再修改, 那當然不會有問題, 但這在實際開發中是不可能的,我們的類會不斷迭代, 一旦類被修改了,那舊對象反序列化就會報錯. 所以在實際開發中, 我們都會顯示指定一個serialVersionUID, 值是多少無所謂, 只要不變就行。

寫個實例測試下:

User類

不顯示指定serialVersionUID.

poYBAGLM5bmATDjoAADE3tBVFuI262.jpg

poYBAGLM5cKARs6HAABKja56wSg415.jpg

測試類

先進行序列化, 再進行反序列化.

pYYBAGLM5fGADpVAAAGAgrSz_mw962.jpg

pYYBAGLM5fmAEUlsAAA8Wgz1H6o479.jpg

結果

先注釋掉反序列化代碼,執行序列化代碼,然后User類新增一個屬性sex。

pYYBAGLM5iWAZJxyAADVZJJr1Bw657.jpg

pYYBAGLM5i2ACbSAAACcP1Hf3Dg941.jpg

再注釋掉序列化代碼執行反序列化代碼,最后結果如下:

序列化前的結果: 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報錯結果為序列化與反序列化產生的serialVersionUID不一致。

接下來我們在上面User類的基礎上顯示指定一個serialVersionUID。

poYBAGLM5lmALd2xAAAeVtahAXk183.jpg

再執行上述步驟, 測試結果如下:

poYBAGLM5miAFVtCAABGruQrwYg110.jpg

顯示指定serialVersionUID后就解決了序列化與反序列化產生的serialVersionUID不一致的問題。

Java序列化的其他特性

先說結論, 被transient關鍵字修飾的屬性不會被序列化, static屬性也不會被序列化。

我們來測試下這個結論:

User類

poYBAGLM5qaADmAWAAEkCBKh5h4352.jpg

pYYBAGLM5q6AIREwAAETOQGRbiE266.jpg

測試類

pYYBAGLM5uKAUZX_AAGU7j52Bic863.jpg

poYBAGLM5uiAQ0aVAAA7LL1_O6Y789.jpg

結果

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

poYBAGLM5v-ALZ49AAB0bxxmfIk875.jpg

static屬性為什么不會被序列化?

因為序列化是針對對象而言的,而static屬性優先于對象存在,隨著類的加載而加載, 所以不會被序列化。

看到這個結論,是不是有人會問,serialVersionUID也被static修飾,為什么serialVersionUID會被序列化? 其實serialVersionUID屬性并沒有被序列化,JVM在序列化對象時會自動生成一個serialVersionUID,然后將我們顯示指定的serialVersionUID屬性值賦給自動生成的serialVersionUID。

審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    7893

    瀏覽量

    149097
  • JAVA
    +關注

    關注

    19

    文章

    2911

    瀏覽量

    103278
  • RPC
    RPC
    +關注

    關注

    0

    文章

    102

    瀏覽量

    11449

原文標題:Java 序列化和反序列化,為什么要實現 Serializable 接口?

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    俄勒岡州禁止數碼設備使用“序列化”技術

    該法案對諸如蘋果iPhone等數字產品產生巨大影響,意即制造商無法利用“零件序列化”技術束縛消費者選擇第三方維修服務或自主修復非原產部件,同時也不能以此減少設備性能或誤導使用者。
    的頭像 發表于 03-28 10:46 ?332次閱讀

    淺析閉源系統下的Evilparcel漏洞

    Evilparcel漏洞可以導致Bundle在多次序列化反序列化過程中內容發生改變。結合LAW跳板,可以實現權限提升,嚴重影響系統安全
    發表于 11-16 14:43 ?209次閱讀
    淺析閉源系統下的Evilparcel漏洞

    什么時候需要Boost序列化

    程序開發中,序列化是經常需要用到的。像一些相對高級語言,比如JAVA, C#都已經很好的支持了序列化,那么C++呢?當然一個比較好的選擇就是用Boost,這個號稱C++準標準庫的東西。 什么時候需要
    的頭像 發表于 11-10 10:14 ?239次閱讀

    protobuf的編碼和存儲方式

    一、protobuf簡介: 1.1 protobuf的定義: protobuf是用來干嘛的? protobuf是一種用于 對結構數據進行序列化的工具,從而實現 數據存儲和交換。 (主要用于網絡通信
    的頭像 發表于 11-09 09:27 ?548次閱讀
    protobuf的編碼和存儲方式

    FPGA電路實現:m序列及應用

    m序列簡介 m序列是一種常用的偽隨機序列,由具有反饋函數的移位寄存器電路產生,具有周期性,一旦反饋表達式及移位寄存器的初值(又稱為種子)給定,就可以重復實現某組確定的
    發表于 11-06 17:03

    Java序列化怎么使用

    轉換方式就叫做序列化。將文件或者網絡傳輸中得到的 byte[] 數組轉換為 java 對象就叫做反序列化。 怎么使用 如果一個 Java 對象要能被序列化,必須實現一個特殊
    的頭像 發表于 10-10 14:19 ?281次閱讀

    Spring Boot時配置JSON序列化選項的幾種方法

    在Spring Boot Web 項目中,當使用JSON格式接收數據和返回數據的時候,Spring Boot 默認使用一個ObjectMapper實例來序列化響應和反序列化請求。 在本文中,我們
    的頭像 發表于 10-09 10:26 ?1326次閱讀

    如何用C語言進行json的序列化反序列化

    json是目前最為流行的文本數據傳輸格式,特別是在網絡通信上廣泛應用,隨著物聯網的興起,在嵌入式設備上,也需要開始使用json進行數據傳輸,那么,如何快速簡潔地用C語言進行json的序列化反序列化
    的頭像 發表于 10-07 11:05 ?928次閱讀

    如何使用Serde進行序列化反序列化

    Serde 是一個用于序列化反序列化 Rust 數據結構的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化反序列化方式。Serde 的特點是代碼簡潔、易于
    的頭像 發表于 09-30 17:09 ?968次閱讀

    ROS中的序列化實現

    理解了序列化,再回到ROS。我們發現,ROS沒有采用第三方的序列化工具,而是選擇自己實現,代碼在roscpp_core項目下的roscpp_serialization中,見下圖。這個功能涉及的代碼
    的頭像 發表于 09-14 17:26 ?653次閱讀

    什么是序列化 為什么要序列化

    什么是序列化? “序列化”(Serialization )的意思是將一個對象轉化為字節流。 這里說的對象可以理解為“面向對象”里的那個對象,具體的就是存儲在內存中的對象數據。 與之相反的過程是“
    的頭像 發表于 09-14 17:22 ?1758次閱讀
    什么是<b class='flag-5'>序列化</b> 為什么要<b class='flag-5'>序列化</b>

    基于反序列化過采樣數據的時鐘和數據恢復單元

    電子發燒友網站提供《基于反序列化過采樣數據的時鐘和數據恢復單元.pdf》資料免費下載
    發表于 09-13 10:41 ?0次下載
    基于<b class='flag-5'>反序列化</b>過采樣數據的時鐘和數據恢復單元

    螞蟻集團開源高性能多語言序列化框架Fury解讀

    Fury 是一個基于 JIT 動態編譯和零拷貝的多語言序列化框架,支持 Java/Python/Golang/JavaScript/C++ 等語言,提供全自動的對象多語言 / 跨語言序列化能力,和相比 JDK 最高 170 倍的性能。
    的頭像 發表于 08-25 17:05 ?802次閱讀
    螞蟻集團開源高性能多語言<b class='flag-5'>序列化</b>框架Fury解讀

    378 IO流ObjectInputStream 對象的反序列化

    編程程序代碼
    充八萬
    發布于 :2023年07月26日 03:33:29

    JVM源碼分析之不保證順序的Class.getMethods

    如果大家看過或者實現序列化反序列化的代碼,這個問題就不難回答了,今天碰到的這個問題其實是發生在大家可能最常用的`fastjson`庫里的,所以如果大家在使用這個庫,請務必檢查下你的代碼,以免踩到此坑
    的頭像 發表于 06-27 15:22 ?403次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>