我们都知道对象要序列化和反序列化要实现Serializable接口,但是仅仅知道这一点似乎还少了一点,那就是serialVersionUID要不要声明。
有时候我们似乎不声明serialVersionUID也不会报错,但是有时候又会莫名其妙的收到InvalidClassException错误。似乎我们有必要来了解一下serialVersionUID的作用到底是什么了。
在没有显示声明serialVersionUID的时候,Java编译器会给我们生成一个默认的serialVersionUID,并且这个生成也会遵循一定的规范。但是不同的Java编译器可能会生成不同的serialVersionUID,所以在反序列化的时候就会收到InvalidClassException的错误。
所以为了避免因Java编译器不同导致反序列化失败的问题,最好还是要显示的声明一下serialVersionUID。这个serialVersionUID就是标明对象的版本的,如果版本号不对,Java将不会对其进行反序列化。
所以这就能解释之前我在idea中启动项目把Redis中的一个缓存对象读出来反序列化为Java对象时为什么报错了。因为生成这个缓存对象的jdk和我本地的jdk不一样,导致默认生成的serialVersionUID也不一样,这就产生了InvalidClassException错误了。我把类显示声明一下serialVersionUID就好了。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!