2011-05-20 98 views
2

我有一個java服務器,通過套接字將一些數據發送到android中開發的客戶端。 發送的數據是序列化......在試圖從ObjectInputStream中我碰到下面的錯誤,閱讀時客戶端:可序列化類錯誤

java.lang.ClassNotFoundException: servers.Coordinate  
at java.lang.Class.classForName(Native Method) 
at java.lang.Class.forName(Class.java:237) 
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2604) 
at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1860) 
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:840) 
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2080) 
java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:943) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2254) 
at com.Server_1.ClientThread_special.run(ClientThread_special.java:30) 
at java.lang.Thread.run(Thread.java:1096) 
Caused by: java.lang.NoClassDefFoundError: servers.Coordinate 
Caused by: java.lang.ClassNotFoundException: servers.Coordinate in loader [email protected] 
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 

現在,這裏是我的代碼在服務器端:

clientSocket = serverSocket.accept(); 
     System.out.println("S-a conectat clientul de monitorizare!"); 


     os=new ObjectOutputStream(clientSocket.getOutputStream()); 
     try{ 
     while(true){ 
      coord=(Coordinate)queue.take(); 
      System.out.println(coord.getLat()); 
     os.writeObject(coord); 

     os.flush(); 

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

     } 

在客戶端我有這樣的:

public void run() { 

    try { 
     InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 

     Socket socket = new Socket(serverIpAddress, serverPort); 

     is=new ObjectInputStream(socket.getInputStream()); 



      try{ 
       while(!stop){ 

      coord=(Coordinate)is.readObject(); 

      System.out.println("Date de la clientul de monitorizare:"+coord.getLat()); 

      } 

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

     is.close(); 

    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

,這裏是我的serializ能夠類我把它都在客戶端和服務器端:

public class Coordinate implements Serializable{ 

    private final double lon; 

    private final double lat; 

    private final int workerId; 



    public Coordinate(double lat, double lon, int workerId) { 

    this.lat = lat; 
    this.lon = lon; 

    this.workerId=workerId; 
    } 

    public double getLon() { 
    return lon; 
    } 

    public double getLat() { 
    return lat; 
    } 
    public int getwId(){ 
     return workerId; 
    } 


} 

這個類的一個實例就是我送過插座。


編輯:

上服務器我有以下:

包服務器;

import java.io.Serializable;

公共類座標實現Serializable {

private final double lon; 

    private final double lat; 

    private final int workerId; 



    public Coordinate(double lat, double lon, int workerId) { 

    this.lat = lat; 
    this.lon = lon; 

    this.workerId=workerId; 
    } 

    public double getLon() { 
    return lon; 
    } 

    public double getLat() { 
    return lat; 
    } 
    public int getwId(){ 
     return workerId; 
    } 


} 

在客戶端我有以下:

包com.Server_1;

import java.io.Serializable;

公共類座標實現Serializable {

private final double lon; 

    private final double lat; 

    private final int workerId; 

    public Coordinate(double lat, double lon, int workerId) { 

    this.lat = lat; 
    this.lon = lon; 

    this.workerId=workerId; 
    } 

    public double getLon() { 
    return lon; 
    } 

    public double getLat() { 
    return lat; 
    } 
    public int getwId(){ 
     return workerId; 
    } 


} 

我不明白我怎麼能更改包是他們兩人的相同!!!!!!

+2

您沒有在Coordinate類中顯示包。包是什麼?在服務器和客戶端上是一樣的嗎? – Brigham 2011-05-20 18:19:53

+0

但是有兩種不同的應用程序我怎樣才能把相同的軟件包放在座標類上? – embry 2011-05-20 19:37:04

+0

我不明白爲什麼你認爲你可以在客戶端使用相同的包名。只需將服務器項目中的類複製並粘貼到客戶端項目即可。而已! (或者更好的辦法是把這個班放在一個共同的項目中) – Kaj 2011-05-20 19:51:32

回答

4

該類的包名稱在服務器和客戶端上必須相同。我也將serialVersionUID添加到類中。 Implementing Serializable

+0

我會編輯我的問題,請看看它.Thx – embry 2011-05-20 19:37:46

+0

您**必須**在客戶端和服務器中都使用相同的軟件包名稱。我不明白你爲什麼要在客戶端代碼中給這個類一個不同的包名稱。 – Kaj 2011-05-20 19:50:10