在分布式场景,比如我想给服务B的一个实体类传输到服务A中,给对象转换成可以传输的字节流数据,这就是序列化.
把一个存储在内存里面的数据转换成可传输和可存储的对象这就是序列化.
在rpc框架的话,序列化是必须存在的.
(一)serialVersionUID 序列化版本号
这是一个版本号,如果不定义的话,会自己生成一个,serialVersionUID 是一种安全校验的机制,序列化对象的id和反序列化对象的id是一致的,这样的话就能对序列化的安全性做一个识别.如果序列化时候的id和反序列化的id不一致就不允许序列化.
serialVersionUID 生成规则是根据对象的字段属性去生成
在使用的时候一定要注意别忘了定义一下,不然有的程序员可能看到没有定义serialVersionUID ,手欠自己定义了一个,那么序列化的对象和反序列化的对象不一致就会抛出异常.
(二)Transient
是控制成员属性的序列化方式,如果在成员属性加了transient的话, 这个成员在进行序列化的时候就会被拆除在外.
可以在被序列化的类声明writeObject 和readObject,就能读取到被transient修饰的成员变量了.
public class User implements Serializable {
private static final long serialVersionUID = -434539422310062943L;
private String name;
private int age;
private void writeObject(java.io.ObjectOutputStream s) throws IOException {
s.defaultWriteObject();
s.writeObject(name);
}
private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException {
s.defaultReadObject();
name=(String)s.readObject();
}
(三)jdk内置序列化问题
序列化涉及到给对象转换成数据流,反序列化是给数据类转换成对象,
影响rpc通讯性能的因素
1. 序列化的计算性能
2. 数据包的大小
3. 分布式架构是跨语言的(语言的多样性),所以序列化需要有跨语言的要求.
xml序列化是给对象转成xml再转成数据流
json序列化是给对象转成json在转成数据流
hessian是跨语言的二进制序列化协议