一、背景知识:
- 1、序列化的作用:
序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。如果,我们需要将People对象的属性(name,age,gender),写入到Txt、Excel等文档,或者传递给其他模块使用,那么我们需要用到序列化和反序列化。
- 2、序列化的使用:
如果需要标识某对象为可序列化,仅需要继承 Serializable接口,同时必须生成序列化UID serialVersionUID。例如
- 3、使用注意:
《阿里巴巴Java开发手册》中有以下强制规定:
如果更改了UID,会导致对象的新增或修改的属性缺失。
- 如果People类序列化后,从A序列化传给B,UID不一致,会导致:序列化兼容性不一致异常, java.io.InvalidClassException 异常
- 如果People类在A新增属性age后,序列化传给B,UID一致,会导致:A新增属性age丢失
- 如果People类在B删除属性sex后,A传给B,UID一致,会导致:sex属性为空,数值丢失
- 如果People类在B新增属性age后,A传给B,UID一致,会导致:age属性被赋予默认值0
- 4、源码少不了
我们再来看看源码说明书:
可以看到,序列化接口只是一个接口,一个标识符,继承了标识符,我们才能正确的序列化。同时,源码中也强烈建议为了确保不同的编译器的UID一致,UID必须显示声明。
其他的知识,如:Serializable 和 Externalizable区别、transient、自定义序列化策略,用到再详细说明。
二、线上问题
今天需要开发一个小功能,存储线上礼包的权益信息,由于一条数据,会有多条权益信息,所以用List来存储权益内容。上代码:
乍一看,没啥问题,可是放开发环境跑一下,问题就来了。
com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method
dubbo运行时,rpc调用异常。
差不多心里有数了,应该是没有正确序列化,定位到问题一检查,果然:
保存权益的对象中,RightsContentModel 也需要继承序列化接口。修改后,问题解决。