Redis序列化和反序列化

Vic*_*edo 6 serializable redis deserialization spring-data spring-data-redis

我注意到存储在Redis中的一些序列化对象在反序列化方面存在问题.

当我对存储在Redis中的对象类进行更改时,通常会发生这种情况.

我想了解这个问题,以便为解决方案设计一个清晰的设计.

我的问题是,导致反序列化问题的原因是什么?拆除公共/私人财产会导致问题吗?或许可以添加新属性?为类添加新函数会产生问题吗?更多的构造函数呢?

在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加了函数等)myObject,它会导致反序列化问题吗?

Sat*_*ish 17

是什么导致反序列化问题?

在回答你的问题之前,我想给你一些背景知识,

序列化运行时将每个可序列化类与版本号相关联,称为serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已加载与该序列化兼容的该对象的类.如果接收者为具有与相应发送者类的serialVersionUID不同的对象加载了一个类,则反序列化将导致InvalidClassException.

如果可序列化类没有显式声明serialVersionUID,那么序列化运行时将根据类的各个方面计算该类的默认serialVersionUID值.它使用类的以下信息来计算SerialVersionUID,

  1. 班级名称.
  2. 类修饰符写为32位整数.
  3. 按名称排序的每个接口的名称.
  4. 对于按字段名称排序的类的每个字段(私有静态和私有瞬态字段除外:
  5. 该字段的名称.
  6. 字段的修饰符写为32位整数.
  7. 该字段的描述符.
  8. 如果存在类初始值设定项,请写出以下内容:

    方法的名称,.

    方法的修饰符java.lang.reflect.Modifier.STATIC,写为32位整数.

    方法的描述符,()V.

  9. 对于按方法名称和签名排序的每个非私有构造函数:

    方法的名称,.

    该方法的修饰符写为32位整数.

    方法的描述符.

  10. 对于按方法名称和签名排序的每个非私有方法:

    方法的名称.

    该方法的修饰符写为32位整数.

    方法的描述符.

那么,回答你的问题,

拆除公共/私人财产会导致问题吗?或许可以添加新属性?为类添加新函数会产生问题吗?更多的构造函数呢?

是的,默认情况下所有这些添加/删除都会导致问题.

但是克服这种情况的一种方法是明确定义SerialVersionUID,这将告诉序列化系统我知道该类将随着时间的推移而演变(或进化)并且不会抛出错误.因此,反序列化系统只读取两侧存在的那些字段并分配值.反序列化侧新添加的字段将获得默认值.如果在反序列化方面删除了某些字段,则算法只会读取和跳过.

以下是可以声明SerialVersionUID的方式,

private static final long serialVersionUID = 3487495895819393L;
Run Code Online (Sandbox Code Playgroud)