Java问题设置serialVersionUID

时间:2018-04-28 13:09:22

标签: java networking serialization

我目前正在尝试编写一个类似多人空间入侵者的游戏,其中客户端在计算机上运行,​​而服务器在Android设备上运行。出于这个原因,我需要通过网络传输所有对象的位置,我正在使用序列化。 起初我有这个类的游戏数据,这不是线程安全的,但可以序列化和反序列化就好了:

public class gamestate implements Serializable{

  public ship firstplayer;
  public ship secondplayer;
  public ship[] enemies;

}

正如我所说,这不是线程安全的,所以我尝试添加一个空方法,这会强制Java在继续之前重新获取对象:

synchronized void v(){}

这就是问题的开始。即使我在PC和手机上有完全相同的代码,生成的serialVersionUID也不匹配,所以我尝试自己设置它们。

  static final long serialVersionUID = 1000L;

这有以下结果:

ru.black.ksserver.gamestate; local class incompatible: stream classdesc serialVersionUID = 1000, local class serialVersionUID = -4828470651897483247

似乎在Android上设置它完全正常,而在PC上设置它没有。任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:0)

如果您要在课程中使用明确的serialVersionUID,则需要:

  • 在班级的所有副本中使用serialVersionUID的相同值
  • 确保您处理序列化中包含的任何差异。

如果您未在类中使用显式serialVersionUID,则两端的类版本必须具有相同的默认序列版本。 Object Serialization spec解释了如何计算默认的串行版本。

  

似乎在Android上设置它完全正常,而在PC上设置它没有。

实际上,在我看来,您试图在一个没有明确serialVersionUID变量的类中读取使用serialVersionUID 1000序列化的实例。那不会起作用。

您是否真的更改了类以在PC端添加显式serialVersionUID变量?看起来你没有......

答案 1 :(得分:-1)

我(有点)解决了它和它的一个错误。如果我使用最新的JDk运行我的程序它完全忽略了这个字段,它只会在使用旧的JDK时执行它应该做的事情。他们是否在最新更新中更改了某些内容?或者我的装置可能已经坏了......