在搭建一个简单的交互式游戏服务器平台,搭建环境是在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();
        }
 }

解决方案 »

  1.   

    贴下报错啊!打印出来 两个序列化id不一致嘛?
    可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID 的值 跟 文件里面比较下。
      

  2.   

    将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 
    应该是序列化后 又增添了 属性之类的 造成了  值改变吧。
      

  3.   

    B端异常内容一致,就是stack的路径不太一样,毕竟服务器端里的代码和B端不一样
      

  4.   

    将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 
    应该是序列化后 又增添了 属性之类的 造成了  值改变吧。
    问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样
      

  5.   

    将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 
    应该是序列化后 又增添了 属性之类的 造成了  值改变吧。
    问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样
    还有麻烦问下你前面说的serialver是怎么调用的- -
      

  6.   

    将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 
    应该是序列化后 又增添了 属性之类的 造成了  值改变吧。
    问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样
    还有麻烦问下你前面说的serialver是怎么调用的- -
    直接重新生成吧,同名的类的id保持不一致,唯一。应该就可以了
      

  7.   

    将local class 的 serialVersionUid的值赋给 private static final long serialVesionUID 
    应该是序列化后 又增添了 属性之类的 造成了  值改变吧。
    问题就在于我核对过全部代码,确实没有再增加什么东西了,从A到服务器再到B只有传输过程,没有修改步骤,而且就算不到B,只传到服务器也会报这个错,也就是说连A端跟服务器上的UID都不一样
    还有麻烦问下你前面说的serialver是怎么调用的- -
    直接重新生成吧,同名的类的id保持不一致,唯一。应该就可以了实在不行,去掉序列化白
      

  8.   

    这样序列化 是不是要求类的路径是一样的?貌似也可以通过ObjectInputStream 。
      

  9.   

    不序列化也可以对象流吗,路径的话我服务器是用Ubantu搭建的,这个咋能做到和windows客户端一样的路径