1. 程式人生 > >淺談序列化-Serialization

淺談序列化-Serialization

什麼是java序列化?

java序列化主要目的是將物件寫入流中,便於通過網路傳輸該物件,當然還可以重建該物件。java序列化的API提供了可以重新生成完全相同的物件的功能,對於網路上java序列化被用來儲存狀態與資料庫同義,這是個不明確的。

如何序列化?

如果要序列化物件需要在相應的類實現可序列化的標記,不想被序列化的物件屬性可以使用transient關鍵字修飾。


  • 實現 java.io.Serializable 介面標記類, 暗示jvm該類可以被序列化,如果不實現介面,會丟擲java.io.NotSerializableException異常。
  • 最好在一開始就給這個類指定一個serialVersionUID
    如果有修改累的成員變數的時候,jvm就不會再根據類名,成員,包名,工程名來計算該值。
serialVersionUID是用於記錄class檔案的版本資訊的,通過一個類的類名,成員,包名,工程名算出來的一個數字。反序列化的時候ObjectInputStream會先拿檔案中的 serialVersionUID與類中的serialVersionUID資料值進行對比,如果不一致會丟擲java.io.InvalidClassException異常,測試異常資訊 :
Exception in thread "main" java.io.InvalidClassException: com.test.demo.serializationsample.Person; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
/**
 * 描述:
 *
 * @author liweigao
 * @create 2018-07-18 下午6:04
 */
@Data
@Builder
public class Person implements Serializable{

    private int age;

    private String name;

}
/**
 * 描述:
 *
 * @author liweigao
 * @create 2018-07-18 下午6:06
 */
public class Sample {


    private static final String fileName = "SampleTest.out"
; public static void serialize(Object serializableObject) throws IOException { ObjectOutputStream oos = null; FileOutputStream fos = null; try { fos = new FileOutputStream(fileName); oos = new ObjectOutputStream(fos); oos.writeObject(serializableObject); } finally { if (null != oos) { oos.close(); } if (null != fos) { fos.close(); } } } private static Object deSerialize() throws IOException, ClassNotFoundException { FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream(fileName); ois = new ObjectInputStream(fis); return ois.readObject(); } finally { if (null != ois) { ois.close(); } if (null != fis) { fis.close(); } } } public static void main(String[] args) throws IOException, ClassNotFoundException { Person person = Person.builder().age(10).name("li").build(); serialize(person); System.out.println("serialize success"); Person personDes = (Person) deSerialize(); System.out.println("deSerialize success " + personDes.toString()); } }

執行main方法 輸出:

serialize success
deSerialize success Person(age=10, name=li)

相關推薦

序列-Serialization

什麼是java序列化? java序列化主要目的是將物件寫入流中,便於通過網路傳輸該物件,當然還可以重建該物件。java序列化的API提供了可以重新生成完全相同的物件的功能,對於網路上java序列化被用來儲存狀態與資料庫同義,這是個不明確的。 如何

序列(1)

引用廖雪峰 序列化基礎 學了一段時間RESTful框架,主要思想是序列化應用和反序列化額應用,老師一般都是從技術層面講的,我以一個小白的層面分享一下理解. 簡而言之,序列化和反序列化,就是對資料格式的轉換. 後端程式基本上都是在操作資料庫, web開發的三個部分就是前端 後端 和資料

[技術]初始語義與賦值語義

真的 class 基本 復制構造函數 spa 數值 復制構造 得到 對數 背景 博主是一個常年使用初始化語義的coder= =,所以經常會遇到這樣的對話 int tmp(0); XXX:誒,你這tmp函數是幹什麽的啊 博主:蛤?我哪裏定義了tmp函數了

指令碼css(一)

讀寫css屬性 每一個dom元素都有一個屬性style,dom.style裡面存放的這個元素的行間樣式,我們可以通過這個屬性來讀寫元素的行間樣式。 注意: 1.我們碰到float這樣的關鍵字屬性的時候,前面要加一個css字首。 float—>cssFloat 2.複合屬性必須拆解 borde

Java序列(Serialization)的理解

  如果你只知道實現 Serializable 介面的物件,可以序列化為本地檔案。那你最好再閱讀該篇文章,文章對序列化進行了更深一步的討論,用實際的例子程式碼講述了序列化的高階認識,包括父類序列化的問題、靜態變數問題、transient 關鍵字的影響、序列化 ID 問題。在筆者實際開發過程中,就多次

為什麼要序列Serialization

一:概念 MSDN的定義:序列化是將物件狀態轉換為可保持或可傳輸的形式的過程。序列化的補集是反序列化,後者將流轉換為物件。這兩個過程一起保證資料易於儲存和傳輸 二: 什麼時候使用序列化: 1)物件序列化可以實現分散式物件。主要應用例如:RMI要利用物件序列化執行遠端主機上的服務,

序列訊號 轉換成 並行訊號 原理

注 :  文中講述的原理是推理和探討 , 和現實中的實現不一定完全相同 。   開始之前, 可以先參考看看我之前寫的兩篇文章 : 《設計一個 硬體 實現的 Dictionary(字典)》  https://www.cnblogs.com/KSongKing/p/1

序列 (Serialization)的幾段定義及在Unity中的使用

將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。在序列化期間,物件將其當前狀態寫入到臨時或永續性儲存區。以後,可以通過從儲存區中讀取或反序列化物件的狀態,重新建立該物件。 ================================================

java 序列(serialization)演算法的透露

宣告[quote]原文出處:http://www.javaworld.com/community/node/2915Submitted by javatips on Thu, 05/07/2009 - 15:28[/quote]序列化是將物件狀態儲存到位元組佇列的過程。反序列

django rest framework 入門1-序列 Serialization

************************************ 推廣一下目前的公司: 小得——知識技能分享平臺,通過知識分享,獲取收益,打造個人品牌和知識網紅 www.exuetech.com ***********************************

java安全編碼指南之:序列Serialization

[toc] # 簡介 序列化是java中一個非常常用又會被人忽視的功能,我們將物件寫入檔案需要序列化,同時,物件如果想要在網路上傳輸也需要進行序列化。 序列化的目的就是保證物件可以正確的傳輸,那麼我們在序列化的過程中需要注意些什麼問題呢? 一起來看看吧。 # 序列化簡介 如果一個物件要想實現序

C#:使用XML實現序列

反序 student stat 類型 接口 ML tst In ise 序列化是將一個對象轉換成字節流以達到將其長期保存在內存、數據庫或文件中的處理過程。它的主要目的是保存對象的狀態以便以後需要的時候使用。與其相反的過程叫做反序列化。 序列化一個對象為了序列化一個對象,我們

Json解析與序列

從頭說起: 首先的首先,什麼是Json:一種資料表示形式,JSON:JavaScript Object Notation物件表示法 Json語法規則: 資料在鍵值對中 資料由逗號分隔 花括號儲存物件 方括號儲存陣列 像這樣: { "firstName":"J

物件中的成員序列問題

       Java物件序列化時參與序列化的內容包含以下幾個方面。         第一、屬性,包括基本資料型別、陣列以及其他物件的應用。         第二、類名。         不能被序列化的內容有以下幾個方面。         第一、方法。         第二

Java的IO流與物件的序列

今天再次回顧了一些關於java IO流的知識。雖然以前會點IO的方面的程式設計,但是還是知其然不知其所以然。 首先上一張IO流的主要家族圖吧。           該圖給出了IO流的具體分類和各類之間的繼承關係。其中還給出了各個類的使用場景和用途。 一、IO流的主流分類

Java反序列漏洞原理(案例未完善後續補充)

序列化與反序列化 序列化用途:方便於物件在網路中的傳輸和儲存 java的反序列化 序列化就是將物件轉換為流,利於儲存和傳輸的格式 反序列化與序列化相反,將流轉換為物件 例如:json序列化、XML序列化、二進位制序列化、SOAP序列化 序列化:java.io.ObjectOutputStream 類

PHP反序列漏洞原理

序列化與反序列化 序列化用途:方便於物件在網路中的傳輸和儲存 0x01 php反序列化漏洞 在PHP應用中,序列化和反序列化一般用做快取,比如session快取,cookie等。 常見的序列化格式: 二進位制格式 位元組陣列 json字串 xml字串 序列化就是將物件轉換為流,利於儲存和傳輸的格式

C#中的序列與反序列

今天我利用這篇文章給大家講解一下C#中的序列化與反序列化。這兩個概念我們再開發中經常用到,但是我們絕大部分只用到了其中的一部分,剩下的部分很多開發人員並不清楚,甚至可以說是不知道。因此我希望通過這篇文章能讓大家對序列化和反序列化的知識有更進一步的掌握。廢話不多說,開始進入正題。 一、什麼是序列化/反序列化 &

Java 深拷貝拷貝 與 序列

put ria div style inpu 深拷貝 地址 blog nbsp 一、淺拷貝、深拷貝   淺拷貝會對對象中的成員變量進行拷貝:如果是基本類型,拷貝的就是基本類型的值;如果屬性是內存地址(引用類型),拷貝的就是內存地址 ;   深拷貝,除了基本類型外,引用類型所

Hadoop Serialization -- hadoop序列具體解釋 (2)【Text,BytesWritable,NullWritable】

tao small oid rem cef get() 每一個 包含 協同工作 回想: 回想序列化,事實上原書的結構非常清晰,我截圖給出書中的章節結構: 序列化最基本的,最底層的是實現writable接口,wiritable規定讀和寫的遊戲規則 (void