国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Hessian 序列化、反序列化

原創 精選
運維
序列化參數有枚舉屬性,序列化端增加一個枚舉,能否正常反序列化?序列化子類,它和父類有同名參數,反序列化時,同名參數能否能正常賦值?

背景

問題和思考:

  • 序列化參數有枚舉屬性,序列化端增加一個枚舉,能否正常反序列化?
  • 序列化子類,它和父類有同名參數,反序列化時,同名參數能否能正常賦值?
  • 序列化對象增加參數,反序列化類不增加參數,能否正常反序列化?
  • 用于序列化傳輸的屬性,用包裝器比較好,還是基本類型比較好?

為什么要使用序列化和反序列化

  1. 程序在運行過程中,產生的數據,不能一直保存在內存中,需要暫時或永久存儲到介質(如磁盤、數據庫、文件)里進行保存,也可能通過網絡發送給協作者。程序獲取原數據,需要從介質,或網絡傳輸獲得。傳輸的過程中,只能使用二進制流進行傳輸。
  2. 簡單的場景,基本類型數據傳輸。通過雙方約定好參數類型,數據接收方按照既定規則對二進制流進行反序列化。

圖片

  1. 復雜的場景,傳輸數據的參數類型可能包括:基本類型、包裝器類型、自定義類、枚舉、時間類型、字符串、容器等。很難簡單通過約定來反序列化二進制流。需要一個通用的協議,共雙方使用,進行序列化和反序列化。

三種序列化協議及對比

序列化協議

特點

jdk
(jdk 自帶)

1. 序列化:除了 static、transient類型
2. 特點:強類型,安全性高,序列化結果攜帶類型信息
3. 反序列化:基于 Field 機制
4. 應用場景:深拷貝

fastjson
(第三方實現)

1. 可讀性好,空間占用小
2. 特點:弱類型,序列化結果不攜帶類型信息,可讀性強。有一些安全性問題
3. 反序列化:基于 Field 機制,兼容 Bean 機制
4. 應用場景:消息、透傳對象

hessian
(第三方實現)

1. 序列化:除了 static、transient 類型
2. 特點:強類型,體積小,可跨語言,序列化結果攜帶類型信息
3. 反序列化:基于 Field 機制,兼容 Bean 機制
4. 應用場景:RPC

對比

Father father = new Father();
father.name = "廚師";
father.comment = "川菜館";
father.simpleInt = 1;
father.boxInt = new Integer(10);
father.simpleDouble = 1;
father.boxDouble = new Double(10);
father.bigDecimal = new BigDecimal(11.5);

運行結果:

jdk序列化結果長度:626,耗時:55
jdk反序列化結果:Father{version=0, name='廚師', comment='川菜館', boxInt=10, simpleInt=1, boxDouble=10.0, simpleDouble=1.0, bigDecimal=11.5}耗時:87

hessian序列化結果長度:182,耗時:56
hessian反序列化結果:Father{version=0, name='廚師', comment='川菜館', boxInt=10, simpleInt=1, boxDouble=10.0, simpleDouble=1.0, bigDecimal=11.5}耗時:7

Fastjson序列化結果長度:119,耗時:225
Fastjson反序列化結果:Father{version=0, name='廚師', comment='川菜館', boxInt=10, simpleInt=1, boxDouble=10.0, simpleDouble=1.0, bigDecimal=11.5}耗時:69

分析:

  • jdk 序列化耗時最短,但是序列化結果長度最長,是其它兩種的 3 ~ 5 倍。
  • fastjson 序列化結果長度最短,但是耗時是其它兩種的 4 倍左右。
  • hessian 序列化耗時與 jdk 差別不大,遠小于 fastjson 序列化耗時。且與 jdk 相比,序列化結果占用空間非常有優勢。另外,hessian 的反序列化速度最快,耗時是其它兩種的 1/10。
  • 綜上比較,hessian 在序列化和反序列化表現中,性能最優。

Hessian 序列化實戰

實驗準備

父類

public class Father implements Serializable {

/**
* 靜態類型不會被序列化
*/
private static final long serialVersionUID = 1L;

/**
* transient 不會被序列化
*/
transient int version = 0;

/**
* 名稱
*/
public String name;

/**
* 備注
*/
public String comment;

/**
* 包裝器類型1
*/
public Integer boxInt;

/**
* 基本類型1
*/
public int simpleInt;

/**
* 包裝器類型2
*/
public Double boxDouble;

/**
* 基本類型2
*/
public double simpleDouble;

/**
* BigDecimal
*/
public BigDecimal bigDecimal;

public Father() {
}

@Override
public String toString() {
return "Father{" +
"version=" + version +
", name='" + name + '\'' +
", comment='" + comment + '\'' +
", boxInt=" + boxInt +
", simpleInt=" + simpleInt +
", boxDouble=" + boxDouble +
", simpleDouble=" + simpleDouble +
", bigDecimal=" + bigDecimal +
'}';
}
}

子類

public class Son extends Father {

/**
* 名稱,與father同名屬性
*/
public String name;

/**
* 自定義類
*/
public Attributes attributes;

/**
* 枚舉
*/
public Color color;

public Son() {
}

}

屬性-自定義類

public class Attributes implements Serializable {

private static final long serialVersionUID = 1L;

public int value;

public String msg;

public Attributes() {
}

public Attributes(int value, String msg) {
this.value = value;
this.msg = msg;
}

}

枚舉

public enum Color {

RED(1, "red"),
YELLOW(2, "yellow")
;

public int value;

public String msg;

Color() {
}

Color(int value, String msg) {
this.value = value;
this.msg = msg;
}
}

使用到的對象及屬性設置

Son son = new Son();
son.name = "廚師"; // 父子類同名字段,只給子類屬性賦值
son.comment = "川菜館";
son.simpleInt = 1;
son.boxInt = new Integer(10);
son.simpleDouble = 1;
son.boxDouble = new Double(10);
son.bigDecimal = new BigDecimal(11.5);
son.color = Color.RED;
son.attributes = new Attributes(11, "hello");

運行結果分析

使用 Hessian 序列化,結果寫入文件,使用 vim 打開。使用 16 進制方式查看,查看命令:%!xxd

00000000: 4307 6474 6f2e 536f 6e9a 046e 616d 6504  C.dto.Son..name.
00000010: 6e61 6d65 0763 6f6d 6d65 6e74 0662 6f78 name.comment.box
00000020: 496e 7409 7369 6d70 6c65 496e 7409 626f Int.simpleInt.bo
00000030: 7844 6f75 626c 650c 7369 6d70 6c65 446f xDouble.simpleDo
00000040: 7562 6c65 0a61 7474 7269 6275 7465 7305 uble.attributes.
00000050: 636f 6c6f 720a 6269 6744 6563 696d 616c color.bigDecimal
00000060: 6002 e58e a8e5 b888 4e03 e5b7 9de8 8f9c `.......N.......
00000070: e9a6 869a 915d 0a5c 430e 6474 6f2e 4174 .....].\C.dto.At
00000080: 7472 6962 7574 6573 9205 7661 6c75 6503 tributes..value.
00000090: 6d73 6761 9b05 6865 6c6c 6f43 0964 746f msga..helloC.dto
000000a0: 2e43 6f6c 6f72 9104 6e61 6d65 6203 5245 .Color..nameb.RE
000000b0: 4443 146a 6176 612e 6d61 7468 2e42 6967 DC.java.math.Big
000000c0: 4465 6369 6d61 6c91 0576 616c 7565 6304 Decimal..valuec.
000000d0: 3131 2e35 0a 11.5.

對其中的十六進制數逐個分析,可以拆解為一下結構:參考 hessian 官方文檔,鏈接:http://hessian.caucho.com/doc/hessian-serialization.html

序列化原理

圖片

序列化規則:

  1. 被序列化的類必須實現了 Serializable 接口

圖片

  1. 靜態屬性和 transient 變量,不會被序列化。

圖片

  1. 枚舉類型在序列化后,存儲的是枚舉變量的名字
  2. 序列化結果的結構:類定義開始標識 C -> 類名長度+類名 -> 屬性數量 -> (逐個)屬性名長度+屬性名 -> 開始實例化標識 -> (按照屬性名順序,逐個設置)屬性值(發現某個屬性是一個對象,循環這個過程)

圖片

反序列化

圖片

通俗原理圖:

圖片

圖片

解釋:這是前邊的序列化文件,可以對著這個結構理解反序列化的過程。

圖片

解釋:讀取到“C”之后,它就知道接下來是一個類的定義,接著就開始讀取類名,屬性個數和每個屬性的名稱。并把這個類的定義緩存到一個_classDefs 的 list 里。

圖片

解釋:通過讀取序列化文件,獲得類名后,會加載這個類,并生成這個類的反序列化器。這里會生成一個_fieldMap,key 為反序列化端這個類所有屬性的名稱,value 為屬性對應的反序列化器。

圖片

解釋:讀到 6 打頭的 2 位十六進制數時,開始類的實例化和賦值。

遺留問題解答:

  • 增加枚舉類型,反序列化不能正常讀取。

圖片

  • 原因:枚舉類型序列化結果中,枚舉屬性對應的值是枚舉名。反序列化時,通過枚舉類類名+枚舉名反射生成枚舉對象。枚舉名找不到就會報錯。
  • 反序列化為子類型,同名屬性值無法正常賦值。

圖片

圖片

圖片

  • 序列化對象增加參數,反序列化可以正常運行。

圖片

原因:反序列化時,是先通過類名加載同名類,并生成同名類的反序列化器,同名類每個屬性對應的反序列化器存儲在一個 map 中。在反序列化二進制文件時,通過讀取到的屬性名,到 map 中獲取對應的反序列化器。若獲取不到,默認是 NullFieldDeserializer.DESER。待到讀值的時候,僅讀值,不作 set 操作

  • 序列化和反序列化雙方都使用對象類型時,更改屬性類型,若序列化方不傳輸數據,序列化結果是‘N’,能正常反序列化。但是對于一方是基本類型,更改屬性類型后,因為 hessian 對于基本類型使用不同范圍的值域,所以無法正常序列化。
責任編輯:未麗燕 來源: 字節跳動技術團隊
相關推薦

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2009-08-06 11:16:25

C#序列化和反序列化

2018-03-19 10:20:23

Java序列化反序列化

2023-12-13 13:49:52

Python序列化模塊

2011-05-18 15:20:13

XML

2011-06-01 14:50:48

2009-08-25 14:24:36

C#序列化和反序列化

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-06-14 22:01:27

Java對象序列化反序列化

2021-11-18 07:39:41

Json 序列化Vue

2012-04-13 10:45:59

XML

2009-09-09 16:10:11

.NET序列化和反序列

2009-08-25 14:43:26

C#序列化和反序列化

2009-09-09 15:47:27

XML序列化和反序列化

2009-09-09 14:45:41

XML序列化和反序列化

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2010-03-19 15:54:21

Java Socket

2016-09-21 00:15:27

2016-01-05 15:10:59

點贊
收藏

51CTO技術棧公眾號

一区二区三区视频免费观看| 深夜福利91大全| 亚洲免费伊人电影在线观看av| 精品视频无码一区二区三区| h1515四虎成人| 亚洲资源网站| 国产一区二区美女诱惑| 精品成人在线视频| 亚洲丁香久久久| 北条麻妃99精品青青久久| 91社在线播放| 成人中文视频| 欧美一区二区在线不卡| 欧美人xxxxx| 97福利一区二区| 成人在线视频亚洲| 亚洲精品五月天| 日本手机在线视频| 久久久噜噜噜| 成人xxxxx| 久久影院资源站| 日韩在线小视频| 欧美调教sm| 国产91精品一区二区麻豆亚洲| 国产日韩精品一区观看| 国产乱码精品一区二区亚洲| 久久精品国产v日韩v亚洲| 欧美黑人猛交| 欧美日本韩国一区二区三区视频| 米奇.777.com| 成人在线高清免费| 亚洲一区二区三区在线视频 | 第一社区sis001原创亚洲| 亚洲国产精品va在线看黑人动漫| 欧美日韩国产中文字幕在线| 国产精品第13页| 久久久av网站| 99视频有精品高清视频| 中文字幕亚洲综合| 国产在线观看免费麻豆| 亚洲视频 欧洲视频| 日韩一区二区高清视频| 日韩av中文字幕一区二区三区| 国产成人在线亚洲欧美| 国产精品x453.com| 亚洲欧美日韩国产一区二区三区| 三级免费网站| 91福利资源站| 99视频免费播放| 久久久久亚洲| 欧美精品性视频| 中文天堂av| 国产精品18久久久久久久久久久久 | 国精产品一区二区三区有限公司 | 国产亚洲久久| 亚洲天堂视频在线观看| 本网站久久精品| 精品国产一区二区三区久久久蜜月 | 亚洲最色的网站| 国产精品偷伦视频免费观看国产| 中文字幕乱码人妻综合二区三区 | 在线观看av中文| 亚洲一区精品在线| 亚洲mv在线| 欧美人伦禁忌dvd放荡欲情| a视频网址在线观看| 777午夜精品免费视频| av伦理在线| 日韩在线小视频| 麻豆成人入口| 成人网在线免费看| 1024日韩| 男女h黄动漫啪啪无遮挡软件| 99久久精品费精品国产一区二区| 国产欧美在线一区| 综合久久综合久久| 成人亚洲综合天堂| 日韩成人在线网站| 一区二区三区自拍视频| 国产精品一二三在线| 久久久久在线| 国产精品-区区久久久狼| 亚洲一区二区影院| 色呦呦在线看| 久久免费视频在线观看| 在线看片一区| 欧美军同video69gay| gogo亚洲高清大胆美女人体| 日本天堂免费a| 偷拍与自拍一区| yw视频在线观看| 色偷偷91综合久久噜噜| 久久久久国产| 亚洲综合日韩欧美| 91成人福利在线| 亚洲天堂av一区| 午夜视频免费在线观看| 丝袜美腿亚洲色图| 99草草国产熟女视频在线| 欧美色另类天堂2015| eeuss在线播放| 久久久久免费精品国产| 久久91麻豆精品一区| 69久久夜色精品国产7777 | 久久久亚洲精选| 日韩中文字幕av| 欧美日本高清视频| 亚洲精品一二三四区| 亚洲精品推荐| 欧洲美女精品免费观看视频 | 卡一精品卡二卡三网站乱码| 艳母动漫在线观看| 精品日韩一区二区| 麻豆一区二区在线| 五月天婷婷在线视频| 亚洲成年人在线| 欧美午夜精彩| 国产对白在线播放| 99久久精品免费精品国产| 欧洲一区精品| 91香蕉视频在线下载| 色狠狠一区二区三区香蕉| 精品免费av一区二区三区| 91入口在线观看| 国产精品久久99| 中文字幕在线高清| 日本一级淫片演员| 色噜噜狠狠色综合欧洲selulu| 欧美成人免费电影| 亚洲人成网站在线观看播放| 亚洲国产成人91精品| 日本不卡在线视频| 岛国精品在线| 日韩av黄色网址| 午夜精品一区二区三区在线视频 | 国产精品久久久久免费| 26uuu国产日韩综合| 中文字幕福利片| 久久综合五月| 成人蜜桃视频网站网址| 亚洲人成电影网站色xx| 欧美伊人影院| 国内av免费| 国产一区二区动漫| 日韩av一区二区三区四区| 22288色视频在线观看| 亚洲欧美日韩在线高清直播| 中文一区在线| 国产精品精华液网站| 日韩视频亚洲视频| 久久国产精品区| 午夜老司机在线观看| 国产精品嫩草影院久久久| 粉嫩av一区二区三区| 国产区在线观看| 国产精品影片在线观看| 久久久夜色精品亚洲| 美女视频在线免费| 欧美精品在线一区| 欧美人妇做爰xxxⅹ性高电影| 日韩福利视频一区| 精品久久一二三| 亚洲国产精品字幕| 亚洲人体大胆视频| 两个人看的免费完整在线观看| 色婷婷**av毛片一区| 国产99久久久国产精品潘金| 日本欧洲一区| 欧美一区二区三区四区五区六区 | 亚洲性图一区二区| 国产欧美日韩视频| 在线观看精品国产视频| 欧美伊人精品成人久久综合97 | 一本大道亚洲视频| 亚洲二区三区不卡| 天天综合入口| 欧美一级大片视频| 一区二区激情小说| 日韩成人动漫在线观看| 成视频年人免费看黄网站| 午夜精品久久17c| 精品magnet| 亚洲成av人电影| 国产超级va在线视频| 日韩免费电影一区二区| 亚洲女人天堂成人av在线| 麻豆一区二区三区| 国产一区二区三区免费在线| 免费一级特黄毛片| 26uuu另类亚洲欧美日本老年| 国产精品伦一区二区三级视频| 国产一区二区欧美| 伊人久久青青草| 日韩高清国产一区在线观看| 日韩一区二区免费在线电影| 国产成人午夜精品影院观看视频| 岛国一区二区| 亚洲女人视频| 国产免费一区| 精品国产一区久久|