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