Ошибка с сериализуемым классом - PullRequest
2 голосов
/ 20 мая 2011

У меня есть сервер 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 dalvik.system.PathClassLoader@43d02e18
 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();
    }

А вот мой сериализуемый класс, у меня он есть как на стороне клиента, так и на стороне сервера:

 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;

открытый класс Coordinate реализует 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;
  }


}

на стороне клиента. У меня есть следующее:

package com.Server_1;

import java.io.Serializable;

открытый класс Coordinate реализует 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;
  }


}

Я не понимаю, как я могу изменить пакет, чтобы он был одинаковым на обоих из них !!!!!!

1 Ответ

4 голосов
/ 20 мая 2011

Имя пакета класса должно быть одинаковым на сервере и клиенте.Я также добавил бы serialVersionUID к классу. Реализация Сериализуемый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...