91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中有哪些序列化格式

發布時間:2021-07-01 15:19:45 來源:億速云 閱讀:358 作者:Leah 欄目:大數據

本篇文章給大家分享的是有關Java中有哪些序列化格式,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

二:Java序列化數據格式


先來一段炒雞簡單的demo代碼作為分析的對象,如下:

class MyClass implements Serializable{    private static final long serialVersionUID = 2L;
   public String name;
   public MyClass(String name) {        this.name = name;    }}
public class Ser {    private static final String SAVED_PATH = "/Users/spring/Desktop/MyClass2.ser";    public static void main(String[] args) throws IOException, ClassNotFoundException {        MyClass c = new MyClass("anyeshe");        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(SAVED_PATH))) {            out.writeObject(c);        }    }}

完后編譯運行一下,在上面那個路徑下就會有一個文件產生,里面就是那個對象序列化的內容,也是下面分析的重點。

工具介紹:

Hex Fiend

Java中有哪些序列化格式

vscode插件

Java中有哪些序列化格式

xxd命令

Java中有哪些序列化格式

總之就是使用這些工具以十六進制查看序列化的內容。以 Hex Fiend 分析結果如下:

Java中有哪些序列化格式

上面提到過魔數,那么java序列化格式應該也有魔數,就是開頭這個2個字節

大名鼎鼎的  ACED  ,源碼里去找一下,如下:

Java中有哪些序列化格式

0005

這個是序列化的版本

Java中有哪些序列化格式

7372 

代表讀取的是一個對象,以及這個對象的類描述

Java中有哪些序列化格式

0015

上面分析都告訴我們后面是一個類了,那么也得告訴我們是那一個類吧,沒錯,這個15就是告訴后面 21(15是十六進制轉十進制是21)個字符是類完全限定名稱,那么往后取21個長度,如下

636F6D2E 7468696E 6B6A6176 612E4D79 436C6173 73

Java中有哪些序列化格式

00000000 00000002 

java對象序列化的實現 Serializable 接口 ,在接口的注釋里有這么一段,如下

Java中有哪些序列化格式

每個序列化的類都有一個版本ID,我們可以自己定義,如果不定義的話編譯器會幫我們定義。示例中我定義的是 2L。

02

被序列化的class的描述信息,通過設置不同flag來標識,如下:

Java中有哪些序列化格式

0001

域的個數,只有一個name,所以是1。

4C

轉ASCII碼是 L , String對象
B' for byte,C' for char, D' for double,F' for float, I' for int, J' for long, L' for non-array object types,  S' for short, Z' for boolean, [` for arrays

0004

后面的四個字節是域的名稱

6E616D65 

轉換成ASCII剛好是我們定義的域 name 

Java中有哪些序列化格式

74

標識后面是字符串,源碼如下:

Java中有哪些序列化格式

0012

轉換為10進制是18,表示后邊字符串中字符個數為18, Ljava/lang/String; 

Java中有哪些序列化格式

4C6A6176 612F6C61 6E672F53 7472696E 673B 

Java中有哪些序列化格式

7870

Java中有哪些序列化格式

Java中有哪些序列化格式

74

標識后面是一個字符串

0007

字符串長度

616E7965 736865 

對象屬性name的值,轉字符串如下

Java中有哪些序列化格式

 

到此,java序列化的內容都分析完成。

三. 簡單追代碼


new ObjectOutputStream()
public ObjectOutputStream(OutputStream out) throws IOException {    verifySubclass();    bout = new BlockDataOutputStream(out);   序列號的數據寫在這個地方    handles = new HandleTable(10, (float) 3.00);    subs = new ReplaceTable(10, (float) 3.00);    enableOverride = false;    writeStreamHeader();     寫頭信息  aced0005    bout.setBlockDataMode(true);    if (extendedDebugInfo) {        debugInfoStack = new DebugTraceInfoStack();    } else {        debugInfoStack = null;    }}
public final void writeObject(Object obj) throws IOException {    if (enableOverride) {        writeObjectOverride(obj);        return;    }    try {        writeObject0(obj, false);   都調用了這個方法    } catch (IOException ex) {        if (depth == 0) {            writeFatalException(ex);        }        throw ex;    }}

Java中有哪些序列化格式

以上就是Java中有哪些序列化格式,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

景洪市| 南皮县| 紫云| 乐陵市| 大化| 兴隆县| 抚顺县| 盘山县| 沂源县| 垣曲县| 新宾| 石屏县| 莱阳市| 海门市| 黔南| 常德市| 青川县| 闵行区| 绥滨县| 威远县| 卢湾区| 万宁市| 河间市| 汤原县| 比如县| 门源| 红河县| 青田县| 正安县| 城固县| 清原| 高台县| 涿鹿县| 曲沃县| 嫩江县| 周宁县| 蒲江县| 自治县| 台北市| 二手房| 陈巴尔虎旗|