簡體   English   中英

序列化和 Android ClassNotFoundException

[英]Serialization and Android ClassNotFoundException

嗨,我正在嘗試將自定義對象列表從客戶端發送到服務器。 我收到ClassNotFoundException 我正在為我的客戶端使用 Android Studio 模擬器並在 Eclipse 上運行我的服務器。 我什至寫了一個測試代碼來檢查它是否在 Eclipse 中工作並且確實如此。 但由於某種原因不適用於android。 我是安卓新手。

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();
            }
        }
    }

例外:

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
java.lang.ClassNotFoundException: Document

因此,您沒有在客戶端部署一個名為Document的類。 從編譯的客戶端代碼行的事實來看,您必須在其他某個包中有一個Document類。 這不是同一個類,不管它叫什么。 它必須是相同的類、相同的包、相同的serialVersionUID

根據異常java.lang.ClassNotFoundException: Document ,這一定是因為類名在編譯時發生了變化。 檢查文檔以排除DocumentReview

更新:還有這個文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM