记录工作中遇到的序列化与反序列化问题

一、背景知识:

  1. 1、序列化的作用:

序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。如果,我们需要将People对象的属性(name,age,gender),写入到Txt、Excel等文档,或者传递给其他模块使用,那么我们需要用到序列化和反序列化。

  1. 2、序列化的使用:

如果需要标识某对象为可序列化,仅需要继承 Serializable接口,同时必须生成序列化UID serialVersionUID。例如

  1. 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
  1. 4、源码少不了

我们再来看看源码说明书:

可以看到,序列化接口只是一个接口,一个标识符,继承了标识符,我们才能正确的序列化。同时,源码中也强烈建议为了确保不同的编译器的UID一致,UID必须显示声明。

其他的知识,如:Serializable 和 Externalizable区别、transient、自定义序列化策略,用到再详细说明。

二、线上问题

今天需要开发一个小功能,存储线上礼包的权益信息,由于一条数据,会有多条权益信息,所以用List来存储权益内容。上代码:

乍一看,没啥问题,可是放开发环境跑一下,问题就来了。

 com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method

dubbo运行时,rpc调用异常。

差不多心里有数了,应该是没有正确序列化,定位到问题一检查,果然:

保存权益的对象中,RightsContentModel 也需要继承序列化接口。修改后,问题解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值