1. 程式人生 > >Java序列化之readObjectNoData、readResolve方法

Java序列化之readObjectNoData、readResolve方法

資料地址:http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/spec/input.html#5903、

①:

private void readObjectNoData() throws ObjectStreamException;  

Serializable物件反序列化時,由於序列化與反序列化提供的class版本不同,序列化的class的super class不同於序列化時的class的super class;或者收到有敵意的流;或接收不完整;都會對初始化物件欄位值時造成影響。 

每個Serializable class都應該定義自己的readObjectNoData方法。如果發生以上情況時,沒有定義readObjectNoData方法時,類的欄位就會初始化成它們的預設值(列在section 4.5.5 of The JavaTM Language Specification, Second Edition)。這種行為在版本1.4 of the JavaTM 2 SDK支援readObjectNoData方法之後是固定的。 


當出現上面的情況時,readObjectNoData會取代readObject的呼叫。 

②:

ANY-ACCESS-MODIFIER Object readResolve()  
             throws ObjectStreamException;  

對於Serializable and Externalizable classes,方法readResolve允許class在反序列化返回物件前替換、解析在流中讀出來的物件。實現readResolve方法,一個class可以直接控制反序化返回的型別和物件引用。 

方法readResolve會在ObjectInputStream已經讀取一個物件並在準備返回前呼叫。ObjectInputStream 會檢查物件的class是否定義了readResolve方法。如果定義了,將由readResolve方法指定返回的物件。返回物件的型別一定要是相容的,否則會丟擲ClassCastException 。

轉自:http://vyloy.iteye.com/blog/1240663

相關推薦

Java序列readObjectNoDatareadResolve方法

資料地址:http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/spec/input.html#5903、 ①: private void readObjectNoData() throws ObjectS

Java序列的方式object類中的方法介面和抽象類的區別ArrayList在迴圈過程中刪除

Java序列化的方式 a.是相應的物件實現了序列化介面Serializable,這個使用的比較多,對於序列化介面Serializable介面是一個空的介面,它的主要作用就是標識這個物件時可序列化的,jre物件在傳輸物件的時候會進行相關的封裝。 b.Externlizab

Java 序列transient關鍵字

1. transient的作用及使用方法 我們都知道一個物件只要實現了Serilizable介面,這個物件就可以被序列化,java的這種序列化模式為開發者提供了很多便利,我們可以不必關係具體序列化的過程,只要這個類實現了Serilizable介面,這個類的所有屬性和方法都會自動序列化。 然而

單例模式的序列與反序列實現需要實現readResolve()方法

package com.linruby.singleton; import java.io.Serializable; public class SingletonObject implements Serializable { private static final Singleto

[Java] 序列基本認識

一、簡介 Java 序列化即將 Java 物件轉換為二進位制序列的過程,主要用於網路通訊、持久化儲存。 二、實現方式 Serializable Java 中實現 Serializable 介面即可實現序列化。 Externalizable Serializabl

Java序列排除被序列欄位(transient/靜態變數)

 我們都知道一個物件只要實現了Serilizable介面,這個物件就可以被序列化,java的這種序列化模式為開發者提供了很多便利,我們可以不必關係具體序列化的過程,只要這個類實現了Serilizable介面,這個類的所有屬性和方法都會自動序列化。       然而在實際

JAVA序列RMI遠端呼叫

RMI(Remote Method Invocation)是Java中的遠端過程呼叫(Remote Procedure Call,RPC)實現,是一種分散式Java應用的實現方式。它的目的在於對開發人員遮蔽橫跨不同JVM和網路連線等細節,使得分佈在不同JVM上的

JAVA對象序列(SerializableObjectOutputStreamObjectInputStream transient)

nbsp 輸出流 out void hang this 對象 code ransient 1)對象序列化是把一個對象變為二進制的數據流的一種方法。對象序列化後可以方便的實現對象的傳輸或存儲。 2)如果一個類的對象想被序列化,則對象所在的類必須實現Serialilzable接

序列Java默認序列技術(ObjectOutputStream與ObjectInputStream)

object java outputstream Java默認序列化技術 主要是通過對象輸出流java.io.ObjectOutputStream對象輸入流java.io.ObjectInputStream來實現的 package com.xingej.ser; public

【轉】Python數據序列(jsonpickleshelve)

大數 保密 不兼容 air shelf pickle 優點 訪問問題 josn 【轉】Python之數據序列化(json、pickle、shelve) 本節內容 前言 json模塊 pickle模塊 shelve模塊 總結 一、前言 1. 現

Java序列——SerializableExternalizable原始碼閱讀與總結

序列化(Serialization):是將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。更通俗地講,是將該物件欄位和狀態資訊以位元組流的方式輸出到目的地。 一是實現pojo物件的讀寫操作,將每個物件轉換為位元組流,而這些位元組流可以被持久化到裝置上,再次讀取時會將位元組流

Java反射getFields()getDeclaredFields()方法

在Java開發中,有兩種獲取欄位的方式:getFields()和getDeclaredFields()。 兩者區別: getFields():獲取某個類的所有的公共(public)的欄位,包括父類中的欄位 getDeclaredFields():獲取某個類的所有宣告的欄位,即包括publ

JAVA小白的進擊路!!!2018.11.05日 關於java序列的那些事

2018.11.05 序列化:把物件轉換為位元組序列 反序列換:把在位元組序列轉換為物件 用途:1、把物件的位元組序列永久的儲存在硬碟中,通常存放在一個檔案中。           2、在網路上傳送物件的位元組序列 案例:web伺服器中的session物件,當有10萬用戶併發

Java IO: 序列與ObjectInputStreamObjectOutputStream

作者:Jakob Jenkov  譯者: 李璟([email protected]) 本小節會簡要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和ObjectOutputStream。 Serializable 原文連結 如果你希望類能夠序列化

java(三)物件的序列與staticfinal關鍵字

Java序列化是指把Java物件轉換為位元組序列的過程;而Java反序列化是指把位元組序列恢復為Java物件的過程。java中存有Cloneable介面,實現此介面的類都具有被拷貝能力,比new一個物件

Java序列Jackson-databind

這個洞的cve編號:CVE-2017-17485,漏洞環境就如第一個連結那樣,jdk需要在jdk 1.8以上。 先看一下Jackson-databind的用法,說白了就是將json轉換成物件。 test-legit.json程式碼如下 {"id":123} 執行結果如圖: 如果注入的json程式碼如下程

Java-序列持久化和壓縮

1. 序列化的作用    將物件變成一串位元組流      不用序列化能否儲存磁碟上?   可以,但是你要將物件中一個個的基本屬性進行寫入操作,比如int之流, 當然,   按你自己希望的順序,.      序列化和持久化之間的關係   序列化過程是持久化的一種方式,當然

Json反序列ObjectMapper(自定義實現反序列方法)

     對於伺服器端開發人員而言,呼叫第三方介面獲取資料,將其“代理”轉化並返給客戶端幾乎是家常便飯的事兒。    一般情況下,第三方介面返回的資料型別是json格式,而伺服器開發人員則需將json格式的資料轉換成物件,繼而對其進行處理並封裝,以返回給客戶端。  

Java序列與ProtocalBuffer序列深入分析(轉)

今天看了《Java序列化與ProtocalBuffer序列化之深入分析》,感覺有所收穫。原文中對ObjectStreamField中關於屬性型別與字元表示的對映沒有指出來,在原帖中回覆了作者,這裡稍作修改並轉發。 從一個簡單物件的序列化內容來看java序列化與ProtocalBuffer序列化機制的

C#中的序列和反序列是什麼有什麼作用使用方法詳解

什麼是序列化與反序列化??? 序列化和反序列化,我們可能經常會聽到,其實通俗一點的解釋,序列化就是把一個物件儲存到一個檔案或資料庫欄位中去,反序列化就是在適當的時候把這個檔案再轉化成原來的物件使用。  當兩個程序在進行遠端通訊時,彼此可以傳送各種型別的資料。無論是何種