查询Java序列化

过度交换

在现有的中添加新的成员方法后,我面临以下问题class Response implements Serializable{}没有声明显式的串行版本ID。多次尝试,将获得相同的序列号。

Error communicating with the webserver: com.abc.xyz.app.util.common.Response;
local class incompatible: stream classdesc serialversionUID = 
-3900355805473150430, local class serialversionUID = 
-6706527232726476603

在查看了一些文档之后,我尝试class Response用附加的行修改private final static long serialVersionUID = 1L;

进行此更改后,以下是错误:

Error communicating with the webserver: com.abc.xyz.app.util.common.Response;
local class incompatible: stream classdesc serialversionUID = 
-3900355805473150430, local class serialversionUID = 1

这些是位于webappstomcat文件夹中并xyz.jnlp在客户端计算机上加载的类新鲜的客户端计算机xyz.jnlp从远程Web服务器加载但是事情不起作用!!!

请帮助我理解这个问题。

尼伯(JB Nizet)

序列化对象时,该类的序列号UID将写入流中。如果该类没有一个,它将使用确定性算法自动生成。

当反序列化给定类的对象时,将本地类的串行版本UID(硬编码或生成)与流中的序列化版本进行比较。如果它们不匹配,则会出现异常:这意味着这些类不兼容。

因此,要解决您的问题,您有2种选择:

  1. 确保服务器和客户端始终共享同一类。那是最好,最简单的解决方案。但这要求每次更新服务器时都更新所有客户端。
  2. 确保这些类始终兼容。由于您的旧类没有硬编码的serialVersionUID,并且您想更改该类并使其兼容,因此您需要对serialVersionUID进行硬编码,其值应与为初始版本自动生成的值相同班级。当然,您必须知道,如果添加字段,接收方将无法读取它们,并且如果您删除字段,则这些字段的接收方值将为null,这可能会破坏不变式。

除非您完全理解所做更改的含义(这很困难并且需要阅读序列化规范),否则我的建议是选择选项1:使客户机和服务器保持最新状态。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章