当前位置: 首页 > 面试题库 >

Redis序列化和反序列化

蓝夕
2023-03-14
问题内容

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

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

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

我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢?

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


问题答案:

什么原因导致反序列化问题?

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

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

如果可序列化的类未明确声明serialVersionUID,则序列化运行时将根据该类的各个方面为该类计算默认的serialVersionUID值,它将使用该类的以下信息来计算SerialVersionUID,

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

方法的名称。

方法的修饰符java.lang.reflect.Modifier.STATIC,用32位整数表示。

方法的描述符()V。

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

方法的名称。

方法的修饰符,写为32位整数。

方法的描述符。

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

方法的名称。

方法的修饰符,写为32位整数。

方法的描述符。

因此,为了回答您的问题,

移除公共/私人财产会引起问题吗? 也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢?

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

但是解决此问题的一种方法是显式定义SerialVersionUID,这将告诉序列化系统我知道该类将随着时间的推移而发展(或发展)并且不会引发错误。因此,反序列化系统仅读取双方都存在的那些字段并分配值。反序列化方面的新添加字段将获得默认值。如果在反序列化方面删除了某些字段,则该算法只会读取和跳过。

以下是声明SerialVersionUID的方法,

private static final long serialVersionUID = 3487495895819393L;


 类似资料:
  • 问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行:

  • 主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台

  • 本文向大家介绍SpringBoot Redis配置Fastjson进行序列化和反序列化实现,包括了SpringBoot Redis配置Fastjson进行序列化和反序列化实现的使用技巧和注意事项,需要的朋友参考一下 FastJson是阿里开源的一个高性能的JSON框架,FastJson数据处理速度快,无论序列化(把JavaBean对象转化成Json格式的字符串)和反序列化(把JSON格式的字符串转

  • 问题内容: 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有很多类(〜50),它们带有应被序列化/反序列化而不是原始的原始字段。喜欢: 所有序列化和反序列化都非常相似,我只需要在整数之后添加一个后缀(C,页面,米等)。 一种简单的方法是在每个这样的字段中添加一对/ 注释并实现它们。但是我最终会得到100个 非常相似的 序列化器/反序列化器。 我想到了添加自定义注释的各个领域,说或,这

  • 问题内容: 每当我尝试序列化文件时,都会收到错误消息:FileNotFound。不知道为什么。这是我的FileHelper代码: 问题答案:

  • 我正在读取xml文件并将其存储到boost::property_tree::ptree pt(object)中。 我试图序列化这个ptree对象使用方法定义在ptree_serialization.hpp 当我使用上述代码时,我得到的错误是:; 如果我做错了什么,你能告诉我吗。请告诉我是否可以序列化xml解析的属性ptree对象。