Java socket通讯时serialVersionUID始终无法一致,但是已经显示声明了serialVersionUID常量

wxr1133 2017-08-29 01:13:45
在搭建一个简单的交互式游戏服务器平台,搭建环境是在Ubantu server上,用java socket做实现,设计思路是实现两个客户端之间的同时竞技,为了传输数据包,用了对象流,自己写了一个封装类,把A客户端需要传输到B客户端的数据封装在一个类对象里,然后从A客户端通过writeObject送到服务器端,再从服务器端readObject,继而再从服务器端writeObject到B客户端,我在服务器端存储了这个封装类的类文件。也就是说A端,B端还有服务器端都有这个封装类,并且serialVersionUID都是一致的,但是建立socket链接并且开始传输数据包后,B端就会提示invalidclassexception,原因是流里的serialVersionUID跟本地的serialVersionUID不一致,请问这是为什么?下帖代码

以下是封装类的代码:
package pushbox;
import java.io.*;
/**
*
* @author ALIENWARE
*/
public class NetworkPackage implements Serializable
{
//private static final long serialVesionUID = 3223814884584068159L;
private Case package_Case;
private GameRole package_GameRole;
public NetworkPackage(Case Current_Case,GameRole Current_GameRole)
{
package_Case = new Case();
package_GameRole = new GameRole();
package_Case = Current_Case;
package_GameRole = Current_GameRole;
}
public Case getPackageCase()
{
return package_Case;
}
public GameRole getPackageGameRole()
{
return package_GameRole;
}
}

以下是建立socket链接的代码:
public class GameClient
{
private static final String IP_ADDRESS = "192.168.1.107";
private static final int PORT = 4700;
private static Socket ClientSocket;
private static ObjectInputStream input;
private static ObjectOutputStream output;
private static JPanel LeftPanel;
private static JPanel RightPanel;
private static NetworkPackage receiveInput;
private static NetworkPackage receiveSend;
private static Thread thread;
private NetworkPackage firstPackage;
//private static int Counter;

public GameClient(Case woodenCase,GameRole gameRole)
{
firstPackage = new NetworkPackage(woodenCase,gameRole);
}
public void StartConnection()
{
System.out.println("The Client is started.");
try
{
ClientSocket = new Socket(IP_ADDRESS,PORT);
output = new ObjectOutputStream(ClientSocket.getOutputStream());
output.writeObject(firstPackage);
output.flush();
input = new ObjectInputStream(ClientSocket.getInputStream());
receiveSend = (NetworkPackage)input.readObject();
System.out.println(receiveSend.getPackageGameRole().getGameRole().x);
}
catch(Exception e)
{
System.err.println(e);
e.printStackTrace();
}
}
...全文
257 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
你倒是跑啊 2017-08-29
  • 打赏
  • 举报
回复
自定义字节流
wxr1133 2017-08-29
  • 打赏
  • 举报
回复
引用 10 楼 zc881124 的回复:
这样序列化 是不是要求类的路径是一样的?貌似也可以通过ObjectInputStream 。
不序列化也可以对象流吗,路径的话我服务器是用Ubantu搭建的,这个咋能做到和windows客户端一样的路径
110成成 2017-08-29
  • 打赏
  • 举报
回复
这样序列化 是不是要求类的路径是一样的?貌似也可以通过ObjectInputStream 。
kobe8free 2017-08-29
  • 打赏
  • 举报
回复
引用 8 楼 JJYYyibanhua 的回复:
[quote=引用 7 楼 wxr1133 的回复:] [quote=引用 6 楼 wxr1133 的回复:] [quote=引用 4 楼 JJYYyibanhua 的回复:] [quote=引用 2 楼 wxr1133 的回复:]
将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 应该是序列化后 又增添了 属性之类的 造成了 值改变吧。[/quote] 问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样[/quote] 还有麻烦问下你前面说的serialver是怎么调用的- -[/quote] 直接重新生成吧,同名的类的id保持不一致,唯一。应该就可以了[/quote] 实在不行,去掉序列化白。。。
kobe8free 2017-08-29
  • 打赏
  • 举报
回复
引用 7 楼 wxr1133 的回复:
[quote=引用 6 楼 wxr1133 的回复:] [quote=引用 4 楼 JJYYyibanhua 的回复:] [quote=引用 2 楼 wxr1133 的回复:]
将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 应该是序列化后 又增添了 属性之类的 造成了 值改变吧。[/quote] 问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样[/quote] 还有麻烦问下你前面说的serialver是怎么调用的- -[/quote] 直接重新生成吧,同名的类的id保持不一致,唯一。应该就可以了
wxr1133 2017-08-29
  • 打赏
  • 举报
回复
引用 6 楼 wxr1133 的回复:
[quote=引用 4 楼 JJYYyibanhua 的回复:] [quote=引用 2 楼 wxr1133 的回复:]
将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 应该是序列化后 又增添了 属性之类的 造成了 值改变吧。[/quote] 问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样[/quote] 还有麻烦问下你前面说的serialver是怎么调用的- -
wxr1133 2017-08-29
  • 打赏
  • 举报
回复
引用 4 楼 JJYYyibanhua 的回复:
[quote=引用 2 楼 wxr1133 的回复:]
将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 应该是序列化后 又增添了 属性之类的 造成了 值改变吧。[/quote] 问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样
wxr1133 2017-08-29
  • 打赏
  • 举报
回复
B端异常内容一致,就是stack的路径不太一样,毕竟服务器端里的代码和B端不一样
kobe8free 2017-08-29
  • 打赏
  • 举报
回复
引用 2 楼 wxr1133 的回复:
将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 应该是序列化后 又增添了 属性之类的 造成了 值改变吧。
wxr1133 2017-08-29
  • 打赏
  • 举报
回复
上面是在服务器端报的异常,B端客户端的异常是一样的
wxr1133 2017-08-29
  • 打赏
  • 举报
回复
kobe8free 2017-08-29
  • 打赏
  • 举报
回复
贴下报错啊!打印出来 两个序列化id不一致嘛? 可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID 的值 跟 文件里面比较下。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧