在写RPC调用的时候,难免会用到Serializable序列化,这个时候传输的对象就必须实现java.io.Serializable接口,这个接口里面没有方法也没有属性,只有一个长长的注释,我们看下这个注释都写了啥内容,总结如下
- 类要能被序列化必须实现Serializable的接口,没有实现这个接口的不能被序列化和反序列化,虽然这个接口既没有方法也没有属性,仅仅是语义上的一个声明.可能抛出NotSerializableException
- 如果父类实现了这个接口,那么他所有的子类都可以被序列化
- 如果子类实现了这个接口,而父类没有,那么为了让这个子类能被序列化,父类必须有一个子类能够访问到的无参构造函数.这样做的原因是为了让子类在反序列化构建的时候能正确的初始化他的父类。
- 如果想要自定义序列化和反序列化的过程,那么可以实现下面几个方法。
writeObject 用来写入序列化数据
readObject 用来恢复序列化数据
readObjectNoData 用来读取特殊情况,比如发送方和接收方的类信息版本不一致或者一个继承了父类一个没有继承。或者stream信息不完整或者遭到破坏. - static 和 transient 修饰的字段会被忽略
- serialVersionUID建议自定义,如果不自定义会使用默认的计算规则,而计算依赖于Java的编译实现,可能会导致发送方和接收方的不一致。不一致会抛出linkInvalidClassException异常。并且建议定义成private的
private static final long serialVersionUID = 42L; - 数组类没有serialVersionUID.