【问题标题】:De-serializing object using TCP使用 TCP 反序列化对象
【发布时间】:2014-05-18 04:08:04
【问题描述】:

我正在尝试编写一个基本的 TCP 服务器,它有一个名为 PersonObject 从单个客户端发送给它。我已经使连接正常工作并将Object 发送到服务器。但是,每当我尝试将读取的Object 转换回Person(客户端和服务器都存在人员类)时,服务器会抛出ClassNotFoundException。问题出在以下代码行

Person person = (Person)in.readObject();

这是服务器类:

public class ConnectionTestServer extends Thread {

private ServerSocket server;
private Socket client;
private BufferedReader reader;


@Override
public void run() {
    try {
        server = new ServerSocket( 25565 );
        client = server.accept();
        ObjectInputStream in = new ObjectInputStream( client.getInputStream() );

        while ( true ){ 
            System.out.println(in.toString());//This was for debug
            if(in.readObject() instanceof Person){//and this
            System.out.println("Working?");
            }
            Person person = (Person)in.readObject();//Here is the ClassNotFoundException
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {

        new ConnectionTestServer().start();

}
}

这是客户端类:

public class ConnectionTestClient {

private static Socket server;

public static void main(String[] args) {
    try {
        server = new Socket("localhost", 25565);

        ObjectOutputStream stream = new ObjectOutputStream( server.getOutputStream() );
        stream.writeObject( new Person() );
        stream.flush();

        server.close();
    } catch (Exception e) {
        System.out.println(e);
    }
}
}

最后是 Person 类:

public class Person implements Serializable {
 public int id = 10;
}

如果有人能帮我解决这个问题,我将不胜感激。此外,对我(可能)糟糕的编码的一些一般建议会很好。谢谢!

【问题讨论】:

  • 也可以导入Person

标签: java sockets tcp deserialization objectinputstream


【解决方案1】:

我之前从 TCP 反序列化对象时遇到过这个问题;

解决方案:

需要将Person类放在服务器端和客户端的同名包中

示例:

服务器 com.utilities -> 该文件夹中的人员类

客户 com.utilities -> 该文件夹中的人员类

同时生成一个serialVersionUID

【讨论】:

    【解决方案2】:

    我同意 Rod_Algonquin。针对您的具体问题,我想补充一下。

    你需要做的事情很少,

    1. 就像 Rob 所说,服务器和客户端的 Person 对象必须在同一个包中并且具有相似的 serialvesrionUID
    2. 您的服务器代码应如下所示:(注意注释行,在您的代码中,您读取对象两次,而只发送一次

      public class Server extends Thread {
      
      private ServerSocket server;
      private Socket client;
      
      
      @Override
      public void run() {
      try {
          server = new ServerSocket(25565);
          client = server.accept();
      
      
      
          while (true) {
              BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
              ObjectInputStream in = new ObjectInputStream(bis);
              System.out.println(in.toString());// This was for debug
      
              /*if (in.readObject() instanceof Person) {// and this
                  System.out.println("Working?");
              }*/
      
              Person person = (Person) in.readObject();
              System.out.println(person.id);
              // Here is the
                                                          // ClassNotFoundException
          }
      
      } catch (Exception e) {
          e.printStackTrace();
      }
      }
      
    3. 还有一个建议,在 Java 套接字编程中,您应该在读取/写入多个对象时使用BufferInputStream/BufferedOutputStream。它会带来更好的性能。

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 2019-10-30
      相关资源
      最近更新 更多