Java的序列化和反序列化,我所遇到的坑
有時需要為物件做持久化,就是把記憶體裡的物件儲存到磁碟(暫且叫做磁碟吧,可以等同於sp、db、檔案、網路等)上,等以後需要這個物件的時候再從磁碟上還原到記憶體,因此需要序列化和反序列化。
如果使用ObjectOutputStream方式序列化,可能出現的坑如下:
坑1、類裡面一定要serialVersionUID,否則舊資料會反序列化會失敗。
serialVersionUID是根據該類名、方法名等資料生產的一個整數,用來驗證版本是否一致。
如果不加這個欄位,當你的類修改了欄位,在反序列化的時候會直接報異常:InvalidCastException,導致無法完成反序列化。
舉個例子:類A沒有新增serialVersionUID,程式碼裡有序列化和反序列化邏輯,app匆匆發版了。然後某一天由於需求變動,在類A裡面增加了一個欄位變成了類AA,再次發版,當新使用者更新app後,使用反序列化以前的資料時,直接報異常。
坑2、一旦序列化儲存到磁碟操作後,就不要修改類名了,否則舊資料會反序列化會失敗。
舉個例子
所以儘量把物件轉換成JSON儲存更穩妥。
相關推薦
【修真院java小課堂】什麼是序列化和反序列化,在RMI中是否要實現 SERIALIZABLE 介面, SERIALVERSIONUID的用處是什麼?
8.更多討論 1、serialVersionUID實際作用 假設本地資料庫中儲存了大量的user物件,後來由於需求,要修改User類中的屬性;如果不設定SerialVersionUID,根據屬性方法等自動生成,就會出現程式碼演示中的錯誤,造
Java Serializable 序列化和反序列化,transient關鍵字
遇到這個 Java Serializable 序列化這個介面,我們可能會有如下的問題a,什麼叫序列化和反序列化 b,作用。為啥要實現這個 Serializable 介面,也就是為啥要序列化 c,serialVersionUID 這個的值到底是在怎麼設
Java的序列化和反序列化,我所遇到的坑
有時需要為物件做持久化,就是把記憶體裡的物件儲存到磁碟(暫且叫做磁碟吧,可以等同於sp、db、檔案、網路等)上,等以後需要這個物件的時候再從磁碟上還原到記憶體,因此需要序列化和反序列化。 如果使用ObjectOutputStream方式序列化,可能出現的坑如下: 坑1、類裡
java 常用序列化和反序列化框架使用-json,kyro,jdk
不知道為什麼部落格不能收藏了,只好轉載過來。 轉載地址:http://blog.csdn.net/earbao/article/details/46914407 package com.baidu.test; import java.io
java中什麽是序列化和反序列化
zab question .com 程序 還原 破壞 ans 但我 實現 序列化:能夠把一個對象用二進制的表示出來。 類似我第一個字節表示什麽屬性名詞,第二個字節表示什麽屬性值,第幾個字段表示有幾個屬性等。 而且這個二進制可以寫到硬
python基礎之繼承組合應用、對象序列化和反序列化,選課系統綜合示例
sel 初始 否則 通用 __init__ period 類型 反序列化 信息 繼承+組合應用示例 1 class Date: #定義時間類,包含姓名、年、月、日,用於返回生日 2 def __init__(self,name,year,mon,day):
java中的序列化和反序列化學習筆記
文件 track 反序列化 out val nts 鼠標 main version 須要序列化的Person類: package cn.itcast_07; import java.io.Serializable; /* * NotSerializableE
java對象的序列化和反序列化
底層 修飾 我們 puts nbsp tostring read one asics 一,對象的序列化,反序列化1.對象的序列化,就是將Object轉換成byte序列,反之叫對象的反序列化2.做序列化需要有流類,序列化流(ObjectOutputStream),是(字節的)
python學習第四天,列表生產式,匿名函數,生成器,內置函數,叠代器,裝飾器,json和pickle的序列化和反序列化
數據 其他 imp 函數名 fun pro serializa and cal 列表生成式,生產器 #列表生成式,可以是代碼更復雜 a = [i for i in range(10)] #這裏的i,可以使用函數來裝飾 print(a) #生產器:就是數據在調用的時候才有
Serializable 指示一個類可以序列化;ICloneable支持克隆,即用與現有實例相同的值創建類的新實例(接口);ISerializable允許對象控制其自己的序列化和反序列化過程(接口)
att 文本 所有 可能 成員 強制 void inter 適用於 Serializable : 序列化是指將對象實例的狀態存儲到存儲媒體的過程。在此過程中,先將對象的公共字段和私有字段以及類的名稱(包括類所在的程序集)轉換為字節流,然後再把字節流寫入數據流。在隨後對對象進
java基礎序--列化和反序列化
color tran public png gin jdk style 硬盤 brush 一、什麽是序列化和反序列化: 序列化:是指把java堆內存中的對象轉換成字節(二進制流)的過程。也就是通過某種方式將java對象存儲在磁盤內存中,這個過程稱為序列化 反序列化:
2018-07-25期 Java序列化和反序列化編程小案例
測試 product set pri get sof serial span not package cn.sjq.Serializable.java;import java.io.FileInputStream;import java.io.FileOutputStrea
Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解釋
計算 transient 全部 序列化對象 語義 meta person int 較高的 遇到這個 Java Serializable 序列化這個接口,我們可能會有如下的問題a,什麽叫序列化和反序列化b,作用。為啥要實現這個 Serializable 接口,也就是為啥要序列
Java-裝飾流-物件流 - 序列化和反序列化
ObjectInputStream(反序列化) & ObjectOutputStream(序列化) 1.先寫出後讀取 2.讀取的順序必須保持一致 3.不是所有的物件都能序列化,要加上serializable接口才行 當不想對物件中的某個屬性序列化時,在屬性中新增transie
java序列化和反序列化物件
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; impo
Java 之 Serializable 序列化和反序列化的概念 通俗易懂!!!
轉自: https://blog.csdn.net/qq_27093465/article/details/78544505 遇到這個 Java Serializable 序列化這個介面,我們可能會有如下的問題a,什麼叫序列化和反序列化 b,作用。為啥要實現這個 Serializable
在C#中,Json的序列化和反序列化的幾種方式總結(轉載)
在這篇文章中,我們將會學到如何使用C#,來序列化物件成為Json格式的資料,以及如何反序列化Json資料到物件。 什麼是JSON? JSON (JavaScript Object Notation) is a lightweight data-interchange format.
Java中使用FastJSON進行物件的序列化和反序列化
Java中使用FastJSON進行物件的序列化和反序列化 1.新增依賴,maven的pom.xml檔案中新增以下依賴 <dependency> <groupId>com.alibaba</groupId> <arti
記一次使用Jackson對Java物件序列化和反序列化的踩坑經歷
背景大概是這樣,專案中的兩個服務A和B依賴了同一個common包的Java類,A對該類json序列化,而B對其反序列化。在一次common包升級過程中,這個Java類中增加了一個屬性,由於B其實用不到這個屬性,就只把A給升級打包了,這就導致B在反序列化時出現了一個異常:com.fasterxml.j
Think In Java——序列化和反序列化
1)Java中的Serializable介面和Externalizable介面有什麼區別? 這個是面試中關於Java序列化問的最多的問題。我的回答是,Externalizable介面提供了兩個方法writeExternal()和readExternal()。這兩個方法給我們