Java 序列化简单探析

在写Java程序过程中,不可避免的要做对象数据通信或者存储,通信中数据格式定义决定了客户端与服务器之间的数据能否正常交流,其实相当于定义了一套规则; 当前基于应用层的数据封装越来越多使用序列化(Serialization),虽然效率没有直接使用数据流的高,但处理和分析却方便很多;因此底层框架设计越来越多基于序列化数据通信,包括当下很流行的基于netty的nio,也支持多种序列化方式,包括json、protobuf和java的Serializable等。java的Serializable虽然效率不高,但原理还是非常值得学习的。今天我们简单研究一下。

Java序列化算法

序列化 (Serialization)是一种将对象通过一连串的字节描述的过程;反序列化(deserialization)是一种将这些字节重建成一个对象的过程。Java提供一种处理对象序列化的标准机制的序列化API。我们将通过一个实例来示范序列化以后的字节是如何描述一个对象的信息的。

在java中,一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,相当于把这个对象做了个标记。 被标记了Serializable的类生产的Class就能被序列化机制处理。

Java 序列化简单探析

实现了序列化接口的类

下面写个简单的测试程序将它序列化和反序列化。

并将这些序列化结果输出到文件看看长啥样。

Java 序列化简单探析

序列化测试代码

执行运行后控制台输出:

DeserializeValue:222:name

说明程序序列化和反序列化正常。

程序比较简单,大家应该能看懂,这边就不详细说明功能了。

序列化的结果数据如下:

Java 序列化简单探析

序列化结果

其中有一些内容可以看出来,比如完整包名(com.examples.serialization.SerializableObject),

被序列化的字段(id,name),序列化类型java.lang.String。

而其它部分不可读,我们转成16进制看看:

Java 序列化简单探析

16进制显示序列化结果

这个序列化结果占用了124个byte。

为啥会占用这么多呢?

分析如下:

AC ED 声明使用了序列化协议

00 05 序列化协议版本

73 声明这是一个新的对象

72 声明这里开始一个新Class

00 1E Class名字的长度

63 6F 6D 2E 65 78 61 6D 70 6C 65 2E 53 65 72 69 61 6C 69 7A 61 62 6C 65 4F 62 6A 65 63 74

对应于我们的包的完整名:com.example.SerializableObject

D0 4F 99 84 6B 67 DA BC 接下来8个byte是 序列化ID,随机生成

02 声明该对象支持序列化

00 02 该类所包含的域个数(我们ID和NAME)

49 域类型. 49 代表"I", 也就是Int

00 02 域名字的长度

69 64 域名字描述

4C 域的类型

00 04 域名字长度

6E 61 6D 65 域名字描述

74 代表一个new String.用String来引用对象

00 12 该String长度

4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B Lcontain;, JVM的标准对象签名表示法

表示java/lang/String

78 对象块结束的标志

70 代表该类没有超类了

00 00 00 DE id变量的值

74 代表一个String

00 04 该String长度

6E 61 6D 65 name的值

这样一个个字段下来,大家应该明白序列化过程中java所干得事情了

照这个规则,我们完全可以自己写一个序列化和反序列化算法,

更能够从这个算法中做出一些优化,

比如包名这东西对跨语言、跨平台根本没意义,我们可以从新制定规则,试序列化包更加精炼高效。

同样,这个分析过程也说明了,序列化过程中只是把属性内容序列化了,方法的东西不会被序列化。

后面附上源码,大家可以自己试试,水平有限,希望可以帮到大家。

package com.example;

import java.io.Serializable;
public class SerializableObject implements Serializable {
private int id = 0;
private String name = "object";
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "SerializableObject{" +
"id=" + id +", name='" + name + '\'' +
'}';
}
}

public class SerializationTest {
public static void main(String[] args) {
new SerializationTest().doTest();
}
public void doTest() {
String fileName = "serialize.obj";
SerializableObject testObj = new SerializableObject();
try {
testObj.setId(222);
testObj.setName("name");
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(fileName));
out.writeObject(testObj);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
fileName));
SerializableObject t = (SerializableObject) in.readObject();
in.close();
System.out.println("DeserializeValue:"+testObj.getId()+":"+testObj.getName());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容