1. 程式人生 > >java基礎序列化、反序列化和transient的作用

java基礎序列化、反序列化和transient的作用

一、概念

為什麼會有序列化?平時我們所說的java記憶體中的物件是無法進行網路通訊和IO操作的,物件將以序列化的儲存狀態(表現形式)被它們所識別。

  1. 序列化:將一個物件轉換成一串二進位制表示的位元組陣列,通過儲存或轉移這些位元組陣列達到持久化的目的。
  2. 反序列化:將位元組陣列重組成物件。

二、實現

序列化只需要實現java.io.Serializable介面就可以了。序列化的時候有一個serialVersionUID引數,Java序列化機制是通過在執行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化,Java虛擬機器會把傳過來的位元組流中的serialVersionUID和本地相應實體類的serialVersionUID進行比較,如果相同就認為是一致的實體類,可以進行反序列化,否則Java虛擬機器會拒絕對這個實體類進行反序列化並丟擲異常。

serialVersionUID有兩種生成方式:

  1. 預設的1L。
  2. 根據類名、介面名、成員方法以及屬性等來生成一個64位的Hash欄位。

Java為使用者定義了預設的序列化、反序列化方法,其實就是ObjectOutputStream的defaultWriteObject方法和ObjectInputStream的defaultReadObject方法。

例項:

import lombok.Data;

import java.io.*;

/**
 * 序列化
 *
 * @author wangmaoyu
 * @create 2018-06-06 11:33
 **/
@Data
public class SerializableObject implements Serializable {
    private String str1;
    private transient String  str2;
    private static  String str3="abc";

    public SerializableObject(String str1, String str2) {
        this.str1 = str1;
        this.str2 = str2;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        File file = new File("f:" + File.separator + "s.txt");
        OutputStream outputStream = new FileOutputStream(file);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(new SerializableObject("str1","str2"));
        objectOutputStream.close();

        FileInputStream fileInputStream = new FileInputStream(file);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        SerializableObject serializableObject= (SerializableObject) objectInputStream.readObject();
        System.out.println(serializableObject.getStr1());
        System.out.println(serializableObject.getStr2());
        objectInputStream.close();
    }
}

結果,變數str2為null,說明以下3點:

  1. 序列化之後儲存的是物件的資訊。
  2. 被宣告為transient的屬性不會被序列化,這就是transient關鍵字的作用。
  3. 被宣告為static的屬性不會被序列化,這個問題可以這麼理解,序列化儲存的是物件的狀態,但是static修飾的變數是屬於類的而不是屬於物件的,因此序列化的時候不會序列化它。

三、總結

  1. 當父類繼承Serializable介面時,所有子類都可以被序列化
  2. 子類實現了Serializable介面,父類沒有,父類中的屬性不能序列化(不報錯,資料丟失),但是在子類中屬性仍能正確序列化。
  3. 如果序列化的屬性是物件,則這個物件也必須實現Serializable介面,否則會報錯。
  4. 反序列化時,如果物件的屬性有修改或刪減,則修改的部分屬性會丟失,但不會報錯。
  5. 反序列化時,如果serialVersionUID被修改,則反序列化時會失敗。

相關推薦

java基礎序列 Java物件表示方式1:序列序列transient關鍵字的作用

轉載自https://www.cnblogs.com/szlbm/p/5504166.html     Java物件表示方式1:序列化、反序列化和transient關鍵字的作用   平時我們在Java記憶體中的物件,是無 法進行IO操作或者網路通訊的

java基礎序列序列transient作用

一、概念為什麼會有序列化?平時我們所說的java記憶體中的物件是無法進行網路通訊和IO操作的,物件將以序列化的儲存狀態(表現形式)被它們所識別。序列化:將一個物件轉換成一串二進位制表示的位元組陣列,通過儲存或轉移這些位元組陣列達到持久化的目的。反序列化:將位元組陣列重組成物件

Java之IO學習(二)物件操作(序列序列

1、內容 序列化就是將物件轉換成位元組序列,方便儲存和轉換 ObjectInputStream--readObject(): 讀入物件,反序列化 ObjectOutputStream--writeO

golang基礎 json序列序列自定義error的一些方法

最近在工作中,用到關於結構體巢狀和序列化的問題,所以在這裡做出整理 1.結構體轉json package main import ( "fmt" "encoding/json" ) type User struct { UserName string `json

Java學習筆記(十三)--序列序列與無參建構函式

概念序列化:將物件儲存到磁碟中,或允許在網路中直接傳輸物件,物件序列化機制允許把記憶體中的Java物件轉換成平臺無關的二進位制,從而可以持久的儲存在磁碟上,也可以在網路中傳輸。反序列化:程式一旦獲得了序

python3 中的Json序列序列 字符編碼的問題解決

ron bsp port imp 入參 oos elf asc 反序列化 python3在通過Json往文件裏寫內容時中文字符被轉成unicode編碼 import json class file_open(object): f = open(‘c

list 分頁工具類 序列序列

  public static byte[] serializeObject(Object object) {          ByteArrayOutputStream saos = new ByteArrayOutputStream();          Ob

序列序列

1.什麼是序列化和反序列化 序列化:將物件的狀態資訊轉換成便於儲存或者傳輸的格式的過程,保證物件的完整性和可傳遞性。常見的序列化格式有位元組陣列,json字串,xml字串等。 反序列化:將位元組陣列,json字串,xml字串等轉換成物件的過程 java的序列化就

fastjson 複雜json 序列序列

getB_list() { return b_list; } public void setB_list(List b_list) { this.b_list = b_list; } public List getC_list() { return c_list; } publ

使用XStream序列序列XML資料時遇到的各種問題

publicclass LevinEnumSingleNameConverter extends EnumSingleValueConverter {     privatestaticfinal String CUSTOM_ENUM_NAME_METHOD ="getName";     privates

序列序列與jsoncpp學習

json是序列化與反序列化的一種方式。 1. 什麼叫序列化和反序列化?用途是什麼? 把物件轉換為位元組序列的過程稱為物件的序列化。 把位元組序列恢復為物件的過程稱為物件的反序列化。 1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在一

C# Serializable(轉) ,序列序列

  Serializable在C#中的作用.NET 中的物件序列化簡介序列化是指將物件例項的狀態儲存到儲存媒體的過程。在此過程中,先將物件的公共欄位和私有欄位以及類的名稱(包括類所在的程式集)轉換為位元組流,然後再把位元組流寫入資料流。在隨後對物件進行反序列化時,將創建出與原物件完全相同的副本。在面向物件的環

C# Json序列序列之Dictionary 字典型別

前提 先引用 Newtonsoft.Json.dll 1.將字典轉化成字串 class Program { static void Main(string[] args) { Dictiona

Hadoop系列-MapReduce自定義資料型別(序列序列機制)(十二)

Github程式碼下載地址: 大家都知道,Hadoop中為Key的資料型別必須實現WritableComparable介面,而Value的資料型別只需要實現Writable介面即可;能做Key的一定可以做Value,能做Value的未必能做Key。但是具體應該怎麼應

jackson自定義全域性序列序列

需要自定義Jackson序列化和反序列化有兩種方式,一種是全域性定義,一種是非全域性定義。先來看看全域性定義。全域性定義的步驟如下

【SpringBoot】 中時間型別 序列序列格式處理

# 【SpringBoot】 中時間型別 序列化、反序列化、格式處理 ## Date **yml全域性配置** ```yaml spring: jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss #配置POST請求

[CNN] 卷積捲積

之前一直太忙,沒時間整理,這兩天抽出點時間整理一下卷積、反捲積、池化、反池化的內容,也希望自己對一些比較模糊的地方可以理解的更加清晰。 一、卷積 1、卷積的簡單定義 卷積神經網路中的卷積操作可以看做是輸入和卷積核的內積運算。其運算過程非常容易理解,下面有舉例。 2、舉例解

考慮可能的執行緒衝突【尤其是初始初始

      如果兩個執行緒同時去掉用一個模組的初始化、反初始化,那麼會發生不可預知的現象。 所以這種情況下,需要一定的引用計數,或者鎖的思想。       統計模組這次在播放器小組的瀏覽器多標籤中就因為初始化、反初始化出現了崩潰,依靠引用計數和鎖才解決的。

Java基礎 - 原碼補碼

目錄 機器數 真值 原碼 反碼 補碼 為什麼使用原碼、 反碼、 補碼 機器數 所有數字在計算機底層都是以二進位制形式存在的.它的表現形式叫做機器數

JAVA基礎序列序列

步驟 per 文件 color 字節 [] ati input des 序列化和反序列化:   把對象轉化為字節序列的過程稱為序列化;   把字節序列恢復為對象的過程稱為對象的反序列化; 方法:   Java.io.ObjectOutputStream代表對象的輸出流,wr