背景
问题和思考:
- 序列化参数有枚举属性,序列化端增加一个枚举,能否正常反序列化?
- 序列化子类,它和父类有同名参数,反序列化时,同名参数能否能正常赋值?
- 序列化对象增加参数,反序列化类不增加参数,能否正常反序列化?
- 用于序列化传输的属性,用包装器比较好,还是基本类型比较好?
为什么要使用序列化和反序列化
- 程序在运行过程中,产生的数据,不能一直保存在内存中,需要暂时或永久存储到介质(如磁盘、数据库、文件)里进行保存,也可能通过网络发送给协作者。程序获取原数据,需要从介质,或网络传输获得。传输的过程中,只能使用二进制流进行传输。
- 简单的场景,基本类型数据传输。通过双方约定好参数类型,数据接收方按照既定规则对二进制流进行反序列化。
- 复杂的场景,传输数据的参数类型可能包括:基本类型、包装器类型、自定义类、枚举、时间类型、字符串、容器等。很难简单通过约定来反序列化二进制流。需要一个通用的协议,共双方使用,进行序列化和反序列化。
三种序列化协议及对比
序列化协议 |
特点 |
jdk |
1. 序列化:除了 static、transient类型 |
fastjson |
1. 可读性好,空间占用小 |
hessian |
1. 序列化:除了 static、transient 类型 |
对比
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);