在搭建一个简单的交互式游戏服务器平台,搭建环境是在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();
}
}
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();
}
}
可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID 的值 跟 文件里面比较下。
应该是序列化后 又增添了 属性之类的 造成了 值改变吧。
应该是序列化后 又增添了 属性之类的 造成了 值改变吧。
问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样
应该是序列化后 又增添了 属性之类的 造成了 值改变吧。
问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样
还有麻烦问下你前面说的serialver是怎么调用的- -
应该是序列化后 又增添了 属性之类的 造成了 值改变吧。
问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样
还有麻烦问下你前面说的serialver是怎么调用的- -
直接重新生成吧,同名的类的id保持不一致,唯一。应该就可以了
应该是序列化后 又增添了 属性之类的 造成了 值改变吧。
问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样
还有麻烦问下你前面说的serialver是怎么调用的- -
直接重新生成吧,同名的类的id保持不一致,唯一。应该就可以了实在不行,去掉序列化白