java反序列化异常接不到_由Java对象反序列化异常想到的
今天寫代碼時候遇到一個異常,異常信息如下:
Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: com.aa.bb.generic.cc.dto.module.ModuleGoodsDTO; local class incompatible: stream classdesc serialVersionUID = -526324944915280489, local class serialVersionUID = 4094977077022888368
Caused by: org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: com.aa.bb.generic.cc.dto.module.ModuleGoodsDTO; local class incompatible: stream classdesc serialVersionUID = -526324944915280489, local class serialVersionUID = 4094977077022888368
Cannot deserialize,很明顯,反序列化異常。特別注意這一句:redis.serializer.SerializationException: Cannot deserialize,用了Redis存儲對象列表,取對象列表時候反序列化出錯了。在代碼里有這一行 Map> moduleIdGoodsListMap = (Map>) redisClient.get(RedisKeyConstant.GOODS_INFO_LIST+currentModuleInfo.getId()); 這里stream classdesc serialVersionUID = -526324944915280489,local class serialVersionUID = 4094977077022888368,兩個serialVersionUID不一致,反序列化異常。
回想了一下,我給ModuleGoodsDTO類新增加了1個字段categoryId,但是ModuleGoodsDTO類前面加了 @SuppressWarnings("serial"),沒有注明 serialVersionUID,這樣新增(修改或刪除)了字段,local class serialVersionUID 默認是會自動變化的。
才想起來serialVersionUID的作用:
序列化時為了保持版本的兼容性,即在版本升級時反序列化仍保持對象的唯一性。
有兩種生成方式:
一個是默認的1L,比如:private static final long serialVersionUID = 1L;
一個是根據類名、接口名、成員方法及屬性等來生成一個64位的哈希字段,比如:
private static final long serialVersionUID = xxxxL;
當你一個類實現了Serializable接口,如果沒有定義serialVersionUID,Eclipse會提供黃色警告,如果沒有考慮到兼容性問題時,不管或者簡單的加一個 @SuppressWarnings("serial") 注解,就會出現上述問題。
如果你的類Serialized序列化存到硬盤上面后,可是后來你卻更改了類的field(增加或減少或改名),當你Deserialize時,就會出現Exception的,這樣就會造成不兼容性的問題。
但當serialVersionUID設置相同時,它就會將不一樣的field以type的預設值(屬性默認值)Deserialize,可避開不兼容性問題。
這里給類 ModuleGoodsDTO 加上 private static final long serialVersionUID = -526324944915280489L; 就好了。
總結
以上是生活随笔為你收集整理的java反序列化异常接不到_由Java对象反序列化异常想到的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux dev alloc name
- 下一篇: mac os touch命令_Mac系统