我目前正在尝试编写一个类似多人空间入侵者的游戏,其中客户端在计算机上运行,而服务器在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上设置它没有。任何人都可以帮我这个吗?
答案 0 :(得分:0)
如果您要在课程中使用明确的serialVersionUID
,则需要:
serialVersionUID
的相同值如果您未在类中使用显式serialVersionUID
,则两端的类版本必须具有相同的默认序列版本。 Object Serialization spec解释了如何计算默认的串行版本。
似乎在Android上设置它完全正常,而在PC上设置它没有。
实际上,在我看来,您试图在一个没有明确serialVersionUID
变量的类中读取使用serialVersionUID
1000序列化的实例。那不会起作用。
您是否真的更改了类以在PC端添加显式serialVersionUID
变量?看起来你没有......
答案 1 :(得分:-1)
我(有点)解决了它和它的一个错误。如果我使用最新的JDk运行我的程序它完全忽略了这个字段,它只会在使用旧的JDK时执行它应该做的事情。他们是否在最新更新中更改了某些内容?或者我的装置可能已经坏了......