1.问题产生
在认证服务中,有一个对象A是用于存储用户登录信息,这个对象需要存入Redis中。当一个新需求过来后,我修改了这个对象A,由于没有清除Redis中的对象A的缓存,当启动项目从Redis中读取对象A时,会报异常,异常的产生原因就是两个对象的序列号不一致。(因为这个原因被一位老哥嘲讽了一波)
什么是序列化??
序列号是什么??
2.序列化和反序列化
2.1是什么?
序列化:将Java对象转换成字节序列的一个 过程
反序列化:字节序列转换成Java对象的一个 过程
2.2为什么?
磁盘只能存储字节码,网络也只能传输字节码,你丢一个Java对象给磁盘或网络,它会告诉亲切的告诉你:“gun” |
---|
2.3怎么办?
我想让我的Java对象实例可以被序列化和反序列化要怎么做,说白了就是:我怎么把我的对象存在磁盘中,又如何让我能够将我亲爱的对象从磁盘中读出来??
2.3.1实现Serializable
只要让你的类实现Serializable接口即可。
接口的代码也比较清晰(啥都没写,能不清晰吗??)
其作用:标记 标记 标记 这个类可以被 序列化
实现了Serializable接口的类可以被ObjectOutputStream和ObjectInputStream来序列化或反序列化。
重点:大多数实现Serializable的接口的类会有一个 静态常量
2.3.2实现Externalizable接口
写法就是下面这样
注:其实Serializable接口也可以自定义序列化和反序列化的方式,写法如下:
2.4序列化注意点
暴露了,我是复制别人文档的
3.序列号什么用处
回到我们开始问题:我的一个登录用户类在添加一个字段后出现反序列化失败的原因是:
①我的用户类没有在编写时添加序列号后,java虚拟机在加载类后自动生成一个 序列号
②当我修改字段时,java虚拟机再次加载这个类,就会生成一个 新的序列号
③当反序列化时,会发现序列号不一致,所以出现无法反序列化的情况
所以:实现序列化时,悄悄的加上一个序列号吧。或者继承我们 的 ApiEntity 嘿嘿