1. 程式人生 > >JAVA序列化ID有什麼用?

JAVA序列化ID有什麼用?

上週一個安卓的兄弟問到了我這個問題,今天我也把這個給寫一下分享給大家

JAVA中通常會看到如下程式碼片斷

    import java.io.Serializable; 
    public class A implements Serializable { 
        private static final long serialVersionUID = 1L; 
    }

下面我為序列化提出一些大家通常會疑惑的問題,並做出解答:
什麼是序列化類?
序列化類是可以被在網路上傳輸的(或者也可以被序列化到本地磁碟並生成.ser就檔案),並且可以被接收方反序列化

為什麼傳輸的類要被序列化呢?


其實也並不是所有的類都要被序列化,我們看一下JAVA原始碼

private void writeObject0(Object obj, boolean unshared) throws IOException {
      ...
    if (obj instanceof String) { 
        writeString((String) obj, unshared);
    } else if (cl.isArray()) { 
        writeArray(obj, desc, unshared);
    } else if (obj instanceof Enum) {
        writeEnum((Enum) obj, desc, unshared);
    } else if (obj instanceof Serializable) {
        writeOrdinaryObject(obj, desc, unshared);
    } else {
        if (extendedDebugInfo) {
            throw new NotSerializableException(cl.getName() + "\n"
                    + debugInfoStack.toString());
        } else {
            throw new NotSerializableException(cl.getName());
        }
    }
    ...  }

字串,陣列,列舉這些型別是不需要序列化的,但是除此之外如果不實現Serializable介面就會報NotSerializableException異常

什麼是序列化ID呢?
虛擬機器是否允許反序列化,不僅取決於類路徑和功能程式碼是否一致,一個非常重要的一點是兩個類的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)
所以反序列化時serialVersionUID也要一致。

什麼場景需要序列化?
兩個客戶端 A 和 B 試圖通過網路傳遞物件資料,A 端將物件 C 序列化為二進位制資料再傳給 B,B 反序列化得到 C。 若者是序列化到磁碟中,再反序列化到記憶體。

服務間資訊互動用序列化好嗎?
我覺得是不好的,並且通常我禁止這樣的形為,原因是它提升了服務間的懶依和耦合,理由如下:
1、現在服務間的溝通越來越頻繁
2、各服務的團隊一般是獨立的
3、所以如果用物件序列化的方式,各服務自己的內容變動可能會影響其它服務的正常執行
4、增加了溝通成本和未知性,比如,當我要改變一個DTO時,我得去詢問有沒有別的服務呼叫了我,假設我沒有所有團隊都問到的話就可能會有遺漏,事實上即使我問到了也不一定能得到肯定的答案

更極端一點的,我們甚至規定能走非同步通迅的就走非同步通訊,這方案几乎被確定為我們的一項開發原則

服務間互動用什麼來代替
把一個MAP或物件轉為JSON字串,要什麼資料就傳什麼資料,字串不需要序列化ID的,內容變動對雙方沒什麼影響,只要不刪除依懶方所需要的業務欄位就可以。

相關推薦

JAVA序列ID有什麼用?

上週一個安卓的兄弟問到了我這個問題,今天我也把這個給寫一下分享給大家 JAVA中通常會看到如下程式碼片斷 import java.io.Serializable; public class A implements Serializable {

Java序列ID的作用

       簡單來說,Java的序列化機制是通過在執行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的位元組流中的serialVersionUID與本地相應實體(類)的serialVersionUID進行比較,如果相同就認為

Java序列版本ID的知識點

1.為什麼要序列化 在網路傳輸中需要序列化成二進位制檔案進行傳輸 在儲存物件時候需要序列化成二進位制檔案進行儲存 2.如何實現序列化 實現介面serializable 3.序列化版本ID的作用 在反序列化的時候起作用,拿到二進位制檔案的id與class檔案進行i

JAVA序列與反射

技術分享 ges img .cn logs 技術 序列化 com -1 JAVA序列化與反射

Java序列接口Serializable接口的作用總結

生命周期 read 避免 什麽 打開 序列號 依賴 為什麽 main 轉載 http://www.cnblogs.com/DreamDrive/p/4005966.html 一個對象有對應的一些屬性,把這個對象保存在硬盤上的過程叫做”持久化”. 把堆內存中的對象的生命周期延

Java序列Serializable和Externalizable

持久化對象 clu version catch 例程 對象 uri put one 紙上得來終覺淺,絕知此事要躬行 --陸遊 問渠那得清如許,為有源頭活水來 --朱熹 什麽是Java序列化?為什麽出現Java序列化?如何實現Java序列化? 一、

java序列對象簡單理解

debug .html 由於 info 傳遞對象 訪問 found 枚舉類型 args 1. 什麽是Java對象序列化   Java平臺允許我們在內存中創建可復用的Java對象,但一般情況下,只有當JVM處於運行時,這些對象才可能存在,即,這些對象的生命周期不會比JVM的生

Java序列與反序列

setname [] 進制 方式 gets 創建 保存 ati 取數據 Java序列化與反序列化是什麽?為什麽需要序列化與反序列化?如何實現Java序列化與反序列化?本文圍繞這些問題進行了探討。 1.Java序列化與反序列化 Java序列化是指把Java對象轉換為字節序

Java 序列

style cep .cn class on() alt new package rgs 1. 序列化介紹 Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。 將序

JAVA序列

lin bsp rsh ack googl 支持 oss java序列化 ssa JBoss的 Marshalling包 只支持javagoogle的protobuf 通用的數據格式 二進制基於protobuf的kyro 性能比較好。基於java

Java序列技術

exc java 姓名 clas () ati private tac 對象 用序列化來存儲對象。 先定義一個用來序列化的類: package io.xuliehua; import java.io.*; public class Student implements

java 序列時排除指定屬性

live es2017 plugin cep ktr org ted pil too ava 序列化對象如何排除指定屬性呢? java 中序列化對象有多種方式:struts2 ,jackson,json-lib (1)使用struts2 json插件 依賴的jar包:

Java序列筆記

ransient com 使用 exception -s ace hit ans 對象 Java序列化 Java提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列, 該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。 p.p1 {

Java 序列工具類

pub ear base64 找不到 ror stream ger public 工具類 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.misc.BASE64Decoder; imp

Java - 序列(1)

內存 args 屬性 close -s num 16px object 成對 文檔: http://www.runoob.com/java/java-serialization.html http://www.importnew.com/24490.html https:/

IDEA自動生成序列ID

img setting 技術 all ide test IT inf PE File -> Settings -> Editor -> Inspections -> 搜索 Serialization issues ,找到 Serializable c

Java序列技術即將被廢除!!!

內存 In https 替代 字符串 支持 alt myba RM 我們的對象並不只是存在內存中,還需要傳輸網絡,或者保存起來下次再加載出來用,所以需要Java序列化技術。Java序列化技術正是將對象轉變成一串由二進制字節組成的數組,可以通過將二進制數據保存到磁盤或者傳輸網

技術分享:Java 序列

bsp 寫入 ddr 應用 特性 知識點 tom == 生成   1. 簡介   1.1. 定義   序列化:序列化是將對象轉換為字節流。   反序列化:反序列化是將字節流轉換為對象。      1.2. 用途   序列化的用途有:   序列化可以將對象的字節序列

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