2012-10-16 22 views
1

我正在編寫一個程序,將對象從一個類發送到另一個類。這裏是我的程序的簡單示例來表示問題。正如您所看到的,從服務器發送到客戶端的對象是學生類,它已在每個類(服務器/客戶端)中分別定義。如何在java中通過TCP發送OBJECT?

Exception in thread "main" java.lang.ClassCastException: ServerSide$1Student cannot be cast to ClientSide$1Student 
    at ClientSide.main(ClientSide.java:29) 

這裏是服務器端的代碼:

我已經通過發送工作正常,但是當涉及到我自己我收到此錯誤定義的類類型的ArrayList檢查該代碼
import java.io.*; 
import java.net.*; 

public class ServerSide { 

    public static void main(String[] args) { 
     class Student implements Serializable 
     { 
      int id; 
      public Student(int num){id=num;} 
      public void setID(int num){id=num;} 
      public void Print(){System.out.println("id = " + id);} 
     } 
     try 
     { 
      Student a = new Student(3); 
      ServerSocket myServerSocket = new ServerSocket(9999); 
      Socket skt = myServerSocket.accept(); 
      try 
      { 
       ObjectOutputStream objectOutput = new ObjectOutputStream(skt.getOutputStream()); 
       objectOutput.writeObject(a);     
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

而對於客戶端是:

import java.io.*; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class ClientSide { 

    public static void main(String[] args) 
    { 
     class Student implements Serializable 
     { 
      int id; 
      public Student(int num){id=num;}   
      public void setID(int num){id=num;} 
      public void Print(){System.out.println("id = " + id);} 
     } 
     try {  
      Socket socket = new Socket("10.1.1.2",9999); 
      try { 
       ObjectInputStream objectInput = new ObjectInputStream(socket.getInputStream()); 
       try { 
        Object object =(Student) objectInput.readObject(); 
        Student tmp = (Student) object; 
        tmp.Print(); 
       } catch (ClassNotFoundException e) { 
        e.printStackTrace(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      }   
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

編輯:

我將它們移動到相同的文件並添加了序列號ID。它工作正常。

回答

12

只有兩個同名的類是不夠的。兩個類必須

  • 同一封裝
  • 在同一外類,如果任何
  • 具有相同的serialVersionUID。

我建議你有一個單獨的類,這對客戶端和服務器都很常見。在一個更復雜的項目中,您可能會考慮在客戶端和服務器模塊所依賴的模塊中構建這些通用組件。

+0

感謝您的回覆,但不幸的是,我不得不使用不同的目錄來從一個程序轉移到另一個程序,這裏是規範。我很感激任何評論: http://tinypic.com/r/26279dt/6 – Bernard

+1

在這種情況下,您不能使用內置的Java序列化。您需要使用其他形式的序列化或編寫自己的。如果他們已經指定你需要使用Java序列化,那麼你需要澄清你明白他們要求什麼。 –

+0

@Bernard該規範沒有說明你需要兩個Student類。 – EJP

4

你永遠不能反序列化代表X類的實例的流變成類Y的一個實例

解決你的問題,你需要移動代碼爲Student類到另一個文件,說學生。 java,並在你的客戶端代碼和你的服務器代碼上使用這個類。

請注意,如果您修改了您的類,則在大多數情況下您需要重新部署服務器(否則客戶端會向服務器發送表示僅爲客戶端所知的類實例的流)。

+0

感謝您的回覆,但不幸的是我不得不使用不同的目錄來從一個程序轉移到另一個程序,這裏是規範。我欣賞任何評論: http://tinypic.com/r/26279dt/6 – Bernard

+1

沒有什麼關於班學生的形象。 –

+1

不管怎樣,這就是Java序列化的工作原理。如果你不能遵守這些規則,你就不能使用它。 –

2

您正在引用兩個不同的類。 Student這是ClientSideStudent的內部,它是ServerSide的內部類。您應該將Student類移至其他文件。