2016-04-27 2 views
-3

Привет Я пытаюсь отправить пользовательский список объектов из клиента на сервер. Я получаю ClassNotFoundException. Я использую эмулятор студии Android для своего клиента и запускаю свой сервер на Eclipse. Я даже написал тестовый код, чтобы проверить, работает ли он в Eclipse, и это так. Но по какой-то причине не работает на Android. Я новичок в Android.Сериализация и Android ClassNotFoundException

import java.io.Serializable; 
import java.util.Arrays;  

public class Document implements Serializable { 
private static final long serialVersionUID = 1L; 
String id; 
String name; 
String address; 
String[] category; 
float lattitude; 
float longitude; 
String city; 
double stars; 
double overallRating; 
// String attributes[]; 
Review[] reviews; 

public Document(String id, String name, String address, String[] category, float longitude, float lattitude, 
     String city, double stars, double overallRating, Review[] review) { 
    super(); 
    this.id = id; 
    this.name = name; 
    this.address = address; 
    this.category = category; 
    this.longitude = longitude; 
    this.lattitude = lattitude; 
    this.city = city; 
    this.stars = stars; 
    this.overallRating = overallRating; 
    this.reviews = review; 
} 

@Override 
public String toString() { 
    return "Document [id=" + id + ", name=" + name + ", address=" + address + ", category=" 
      + Arrays.toString(category) + ", lattitude=" + lattitude + ", longitude=" + longitude + ", city=" + city 
      + ", stars=" + stars + "]"; 
} 

} 

import java.io.Serializable; 

public class Review implements Serializable { 

    private static final long serialVersionUID = -1595783420656910821L; 
    double stars; 
    String review; 

    public Review(double stars, String review) { 
     this.stars = stars; 
     this.review = review; 
    } 

} 

// Часть сервера

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.ObjectOutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.List; 

public class CommunicatewithMobileDevice implements Runnable { 
Socket conn; 
private InvertedIndexA invertedIndex; 
private BufferedReader br; 
private ObjectOutputStream oos; 
private PrintWriter pw; 

public CommunicatewithMobileDevice(Socket sock, InvertedIndexA invertedIndex) { 
    conn = sock; 
    this.invertedIndex = invertedIndex; 
    try { 
     br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()), true); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void run() { 

    try { 

     String ip = br.readLine(); 

     String input[] = br.readLine().split(" "); 
     System.out.println(ip + " " + input[0] + " " + input[1]); 
     List<Document> docs = invertedIndex.search(ip, Float.valueOf(input[0]), Float.valueOf(input[1])); 
     System.out.println(docs.size()); 
     oos = new ObjectOutputStream(this.conn.getOutputStream()); 
     oos.writeObject(docs); 


     oos.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

} 

// одноплодной или сервер

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class Singleton implements Runnable { 
    private ServerSocket conn; 
    private static InvertedIndexA invertedIndex = new InvertedIndexA(Helper.loadCategories()); 
    private boolean isStopped = false; 

    private Singleton() { 
    } 

    public static InvertedIndexA getInstance() { 
     return invertedIndex; 
    } 

    public static void main(String args[]) { 
     new Thread(new Singleton()).start(); 
    } 

    public void acceptsClients() { 
     try { 
      synchronized (this) { 
       conn = new ServerSocket(1503); 
      } 
      while (!isStopped()) { 
       Socket sock = conn.accept(); 
       //System.out.println("Conn accepted"); 
       new Thread(new CommunicatewithMobileDevice(sock, invertedIndex)).start(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    private synchronized boolean isStopped() { 
     return this.isStopped; 
    } 

    public synchronized void stop() { 
     this.isStopped = true; 
     try { 
      this.conn.close(); 
     } catch (IOException e) { 
      throw new RuntimeException("Error closing server", e); 
     } 
    } 

    @Override 
    public void run() { 
     acceptsClients(); 
    } 
} 


    //The android client or a part of it 



import android.Manifest; 
import android.content.pm.PackageManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.ActivityCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.ObjectInputStream; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 

import android.widget.ListView; 
import android.widget.TextView; 
import android.content.Context; 

public class ListOfResults extends AppCompatActivity { 

    CommunicateWithServer comm; 
    GPSTracker gps; 
    String message = ""; 
    List<Document> docs; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list_of_results); 
     comm = new CommunicateWithServer(); 
     Bundle bundle = getIntent().getExtras(); 
     message = bundle.getString("message"); 
     //new Communicate().execute(); 
     new Thread(runnable).start(); 
    } 

    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Socket sock = new Socket("localhost", 1503); 
       PrintWriter pw = new PrintWriter(sock.getOutputStream(), true); 
       pw.println(message); 
       double latitude = 0; 
       double longitude = 0; 
       pw.println(new String(Double.valueOf(latitude) + " " + Double.valueOf(longitude))); 
       ObjectInputStream ois = new ObjectInputStream(sock.getInputStream()); 
       docs = (List<Document>) ois.readObject(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
       //Log.e("print the val",br.readLine()); 
       //System.out.println(docs.size()); 
       Log.e("size", Integer.toString(docs.size())); 


      } catch (IOException | ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       System.out.println("yeassass"); 
      } 
     } 
    }; 

    public void populate(String result) { 
     Log.e("here", "here"); 
     DocumentAdapter documentAdapter = new DocumentAdapter(this, docs); 
     ListView listView = (ListView) findViewById(R.id.listView1); 
     listView.setAdapter(documentAdapter); 
    } 
} 

// Это была тестовая программа я написал для тестирования кода сервера. Работает хорошо здесь

import java.io.IOException; 
    import java.io.ObjectInputStream; 
    import java.io.PrintWriter; 
    import java.net.Socket; 
    import java.util.List; 

    public class Test implements Runnable { 

     public Test() { 
      // TODO Auto-generated constructor stub 
     } 

     public static void main(String args[]) { 
      Test test = new Test(); 
      new Thread(test).start(); 
     } 

     public void run() { 
      testOp(); 
     } 

     private void testOp() { 
      try { 
       Socket sock = new Socket("localhost", 1503); 
       PrintWriter pw = new PrintWriter(sock.getOutputStream(), true); 
       String location = Helper.getLocation(); 
       location = location.substring(location.lastIndexOf(") ") + 2); 
       String split[] = location.split(","); 
       pw.println("Chinese"); 
       pw.println(new String(split[0] + " " + split[1])); 
       ObjectInputStream ois = new ObjectInputStream(sock.getInputStream()); 
       List<Document> docs = (List<Document>) ois.readObject(); 
       System.out.println(docs); 
      } catch (IOException | ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

Exception:

04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err: java.lang.ClassNotFoundException: Document 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.Class.classForName(Native Method) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.Class.forName(Class.java:309) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2263) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1641) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.util.ArrayList.readObject(ArrayList.java:661) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.reflect.Method.invoke(Method.java:372) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1330) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at com.kpt.krishgodiawala.myapplication.ListOfResults$1.run(ListOfResults.java:57) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.Thread.run(Thread.java:818) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err: Caused by: java.lang.ClassNotFoundException: Didn't find class "Document" on path: DexPathList[[zip file "/data/app/com.kpt.krishgodiawala.myapplication-1/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]] 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  ... 20 more 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  Suppressed: java.lang.ClassNotFoundException: Document 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.Class.classForName(Native Method) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.BootClassLoader.findClass(ClassLoader.java:781) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:  at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 
04-26 21:10:04.470 6009-6116/com.kpt.krishgodiawala.myapplication W/System.err:   ... 21 more 
+0

Да, я знаю, что я должен использовать REST, но это не цель. Я даже попробовал запустить клиентский код внутри задачи async, но не повезло. Класс Document и класс обзора одинаковы как в студии android, так и в eclipse. – Krish

+1

Вы получаете * what * 'ClassCastException'? Где это? Где трассировка стека? Каково было сообщение? Какие * классы * были упомянуты в сообщении? Там достаточно информации, чтобы вы могли ответить на свой собственный вопрос, и без этого никто другой не может. – EJP

+0

Привет, я добавил его в конце. И это исключение ClassNotFound, с которым я столкнулся внутри моего клиента android, когда я пытаюсь использовать List = (Список ) ois.readObject(); Извините, что не добавлял его до – Krish

ответ

0
java.lang.ClassNotFoundException: Document 

Так что вам не есть класс с именем Document развернут на клиенте. Из того, что строка кода клиента скомпилирована, вы должны иметь класс Document в другом пакете. Это не тот же класс, независимо от его имени. Он должен быть того же класса, такого же пакета, такого же serialVersionUID.

+0

Его одно и то же имя и его в том же пакете. Содержимое класса - это копия, вставленная с той, что находится на сервере. с тем же serialVersioUID. Да, я тоже не уверен, почему я получаю ошибку. – Krish

+0

Это не так. Если бы это было то же самое, это сработало бы. В соответствии с сообщением об ошибке есть пакет * no *, то есть в пакете, объявленном в классе, в данный момент он не был сериализован. – EJP

+0

Большое вам спасибо. Это сработало. Я не знал, что ему нужен один и тот же пакет, а сериализация с обоих концов. Будет читать javadocs, хотя !!!! Спасибо тонну. – Krish

-1

согласно, за исключением java.lang.ClassNotFoundException: Document, он должен, поскольку имя класса изменено во время компиляции. проверить document исключить Document и Review класс

UPDATE: также this документ

+0

Эй, я просмотрел документы и добавил аннотацию и даже попытался отредактировать файл progaurd-rules.pro, но тоже не повезло. – Krish

+0

Найдите свой файл apk, используйте этот инструмент 'http: // ibotpeaches.github.io/Apktool /' для распаковки байт-кодов, чтобы проверить, есть ли там класс 'Document'. –

+0

Что означает «имя класса, измененное во время компиляции»? – EJP

Смежные вопросы