Java 序列化 格式

public class implements Serializable {
      private static final long serialVersionUID = 1L;
      public byte version = 100;
      public static void main(String[] args) throws IOException {
            ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(
                         "result.obj"));
            Atest = new A();
             // 試圖將對象兩次寫入文件
            out.writeObject(test);
            out.close();
      }
}
上面類序列化後文件如下:
aced 0005 7372 0010 636f 6d2e 796c 6e2e
7365 7269 616c 2e41 0000 0000 0000 0001
0200 0142 0007 7665 7273 696f 6e78 7064

AC ED  固定的2個字節的魔術字
00  05   序列化協議版本
73: TC_OBJECT. 聲明這是一個新的對象

輸出相關類的描述。
0x72: TC_CLASSDESC. 聲明這裏開始一個新 Class 。
0010: 類名長度,包含包名
636f 6d2e 796c 6e2e
7365 7269 616c 2e41 :com.yln.serial.
0000 0000 0000 0001: 8字節的 SerialVersionUID , 序列化 ID ,如果沒有指定,則會由算法隨機生成一個 8byte 的 ID
02: 標記號.該值聲明該對象支持序列化
00 01:該類所包含的字段個數
接下來,輸出其中的一個字段:
42: 表示 B,代表Byte,其餘類型有:
                                'B' // byte
                                'C' // char
                                'D' // double
                                'F' // float
                                'I' // integer
                                'J' // long
                                'S' // short
                                'Z' // boolean
00 07: 域名字的長度
76 65 72 73 69 6F 6E: version, 域名字描述

0x78: TC_ENDBLOCKDATA,對象塊結束的標誌。
0x70: TC_NULL,沒有超類了。

輸出域的值信息:
00: 域值爲00
64: 域值爲100

來看下複雜的例子
public class Contain implements Serializable{
      private static final long serialVersionUID = 1L;
      public byte version = 100;
}
public class Parent implements Serializable{
      private static final long serialVersionUID = 1L;
      public byte version = 100;
}
public class ComplexSerialFormat extends Parent implements Serializable {
      private static final long serialVersionUID = 1L;
      public byte version = 100;
      public Contain cont = new Contain();
      public static void main(String[] args) throws FileNotFoundException, IOException {
             // TODO Auto-generated method stub
            ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(
                         "complex.obj"));
            ComplexSerialFormat test = new ComplexSerialFormat();
            out.writeObject(test);
            out.close();
      }
}
aced 0005 7372 0022 636f 6d2e 796c 6e2e
7365 7269 616c 2e43 6f6d 706c 6578 5365
7269 616c 466f 726d 6174 0000 0000 0000
0001 0200 0242 0007 7665 7273 696f 6e4c
0004 636f 6e74 7400 184c 636f 6d2f 796c
6e2f 7365 7269 616c 2f43 6f6e 7461 696e
3b78 7200 1563 6f6d 2e79 6c6e 2e73 6572
6961 6c2e 5061 7265 6e74 0000 0000 0000
0001 0200 0142 0007 7665 7273 696f 6e78
7064 6473 7200 1663 6f6d 2e79 6c6e 2e73
6572 6961 6c2e 436f 6e74 6169 6e00 0000
0000 0000 0102 0001 4200 0776 6572 7369
6f6e 7870 64

AC ED: STREAM_MAGIC. 聲明使用了序列化協議
00  05: STREAM_VERSION. 序列化協議版本
0x73: TC_OBJECT. 聲明這是一個新的對象
輸出相關類的描述。
0x72: TC_CLASSDESC. 聲明這裏開始一個新 Class 。
0022:類名長度,包含包名
636f 6d2e 796c 6e2e 7365 7269 616c 2e43 6f6d 706c 6578 5365 7269 616c 466f 726d 6174  :  com.yln.serial.ComplexSerialFormat
0000 0000 0000 0001 : 8字節的 SerialVersionUID , 序列化 ID
02: 標記號.該值聲明該對象支持序列化
00 02:該類所包含的字段個數
42:表示 B,代表Byte,其餘類型有:
                                'B' // byte
                                'C' // char
                                'D' // double
                                'F' // float
                                'I' // integer
                                'J' // long
                                'S' // short
                                'Z' // boolean
00 07: 域名字的長度
76 65 72 73 69 6F 6E: version, 域名字描述

輸出下一個域,contain con = new contain();這個有點特殊,是個對象。描述對象類型引用時需要使用JVM的標準對象簽名表示法 
0x4C: 域的類型
0004: 域名字長度
636f 6e74: 域名字 cont
0x74: TC_STRING. 代表一個new String.用String來引用對象
00 18:該String長度
4c 636f 6d2f 796c 6e2f 7365 7269 616c 2f43 6f6e 7461 696e 3b: Lcom/yl/serial/contain; JVM的標準對象簽名表示法
0x78: TC_ENDBLOCKDATA,對象數據塊結束的標誌

輸出超類也就是Parent類描述了
0x72: TC_CLASSDESC. 聲明這個是個新類
00 15: 類名長度
63 6f6d 2e79 6c6e 2e73 6572 6961 6c2e 5061 7265 6e74:com.yln.serial.Parent
0000 0000 0000 0001:8字節的 SerialVersionUID , 序列化 ID
02: 標記號.該值聲明該對象支持序列化
00 01:該類所包含的字段個數
42:表示 B,代表Byte,其餘類型有:
                                'B' // byte
                                'C' // char
                                'D' // double
                                'F' // float
                                'I' // integer
                                'J' // long
                                'S' // short
                                'Z' // boolean
00 07: 域名字的長度
76 65 72 73 69 6F 6E: version, 域名字描述
0x78: TC_ENDBLOCKDATA,對象塊結束的標誌;
0x70: TC_NULL, 說明沒有其他超類的標誌

下一步就是把實例對象的實際值輸出了。這時候是從parent Class的域開始的
64 : parent中version值
64:  ComplexSerialFormat 中值

再往後的bytes比較有意思,算法需要描述contain類的信息,要記住,現在還沒有對contain類進行過描述
73 TC_OBJECT, 聲明這是一個新的對象
72 TC_CLASSDESC聲明這裏開始一個新Class
00 16 類名的長度
63 6f6d 2e79 6c6e 2e73 6572 6961 6c2e 436f 6e 74 6169 6e :contain,類名描述;
00 0000 0000 0000 01:8字節的 SerialVersionUID , 序列化 ID
02: 標記號.該值聲明該對象支持序列化
00 01:該類所包含的字段個數
42:表示 B,代表Byte,其餘類型有:
                                'B' // byte
                                'C' // char
                                'D' // double
                                'F' // float
                                'I' // integer
                                'J' // long
                                'S' // short
                                'Z' // boolean
00 07: 域名字的長度
76 65 72 73 69 6F 6E: version, 域名字描述
0x78: TC_ENDBLOCKDATA,對象塊結束的標誌。
0x70: TC_NULL,沒有超類了。
輸出域的值信息:
00: 域值爲00
64: 域值爲100



發佈了72 篇原創文章 · 獲贊 24 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章