【问题标题】:Java.lang.ClassNotFoundException on ObjectInputStream.readObject() when sending objects from Android to Java Server [duplicate]将对象从 Android 发送到 Java 服务器时 ObjectInputStream.readObject() 上的 Java.lang.ClassNotFoundException [重复]
【发布时间】:2018-10-27 11:02:44
【问题描述】:

我正在使用 Android 应用程序,我需要在 Android 客户端和 Java 服务器之间发送序列化对象(主要来自客户端类)。

我正在使用 ObjectInputStream 和 ObjectOutputStream 通过 Web 套接字发送对象,但是当在服务器中读取对象时,它似乎试图将其转换为 Android 包而不是服务器包中的客户端类。

这是我在 Android 的主 Activity 中调用的简化代码:

package com.example.razer.clienttest;
import android.os.AsyncTask;
import android.widget.Toast;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

public class MessageSender extends AsyncTask<Void,Void,Void> {

    ClienteFree cliente = new ClienteFree();
    String test = "Testing this crap";
    static String ip = ""; //This is where I'm putting my IP

    @Override
    protected Void doInBackground(Void...voids){
        try{
            Socket s = new Socket(ip,7000);
            OutputStream os = s.getOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(os);
            //oos.writeObject(test);
            oos.writeObject(cliente);
            oos.flush();

            InputStream is = s.getInputStream();
            ObjectInputStream ois = new ObjectInputStream(is);
            //String Test2 = (String) ois.readObject();
            ClienteFree cliente2 = (ClienteFree)(ois.readObject());

            is.close();
            ois.close();
            os.close();
            oos.close();
            s.close();
        }catch(Exception e){
            System.out.println(e);
        }
        return null;
    }
}

还有我的服务器实现:

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.List;

public class Server {

    static List<ClienteFree> clientes = new ArrayList<ClienteFree>();
    ClienteFree client = new ClienteFree("Null","Null","Null","null");
    String Test = "Testing this crap again";

    public static final int PORT = 7000;
    public static void main(String[] args) throws IOException, ClassNotFoundException {
            try {
                new Server().runServer();
            } catch (Exception e) {
                e.printStackTrace();
            }
    }

    public void runServer() throws Exception {

        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println("Server up and ready for connection...");
        Socket socket = serverSocket.accept();
        System.out.println("Connection succesful");

        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

        //String Test2 = (String) ois.readObject();
        client = (ClienteFree)(ois.readObject());
        //System.out.println(Test2);
        doSomething(client);

        //oos.writeObject(Test);
        oos.writeObject(client);
        oos.flush();    

        ois.close();
        oos.close();
        socket.close();
        serverSocket.close();
    }

    private void doSomething(ClienteFree client){
    clientes.add(client);
    System.out.println(client.getName());
    client.setName("Poncho");
    }
}

错误显示服务器试图在 Android 包 com.example.razer.clienttest.ClienteFree(我的 android 包)中查找类,而不是服务器之一。如果对象中包含 Observable 类型对象的列表,是否有人知道如何解决此问题或在 Android 和 Java 服务器之间发送对象的正确方法?

我尝试使用 SQL 库将客户端对象从我的服务器序列化到 MySQL 数据库,并且它有效,但我还没有在 Android 中找到合适的方法。

这是我得到的错误:

Server up and ready for connection...
Connection succesful
java.lang.ClassNotFoundException: com.example.razer.clienttest.ClienteFree
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at java.io.ObjectInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at Server.runServer(Server.java:54)
    at Server.main(Server.java:15)

谢谢!

【问题讨论】:

    标签: java android sockets serialization server


    【解决方案1】:

    你发送的类在接收端的CLASSPATH中不存在。

    您不能在不同的包中部署类似的类,并期望它与原始包中的原始类相同。不是。

    【讨论】:

    • 哦,所以即使类在Android应用程序和Java服务器中的定义方式完全相同,如果它们不在同一个包中,它们不被认为是同一个类吗?如果我在客户端和服务器中都创建了一个包(例如 com.package.shared)并将我的类放在那个包中就足够了,或者还有其他一些我遗漏的注意事项吗?抱歉,我是 Android 编程新手,以前从未遇到过这样的问题。
    • 它必须是同一个包中相同的类名,具有相同的serialVersionUID 并满足对象序列化规范的“对象版本控制”一章。这最容易通过复制确保两端始终是完全相同的 .class 文件来完成。您可以通过 IDE 中的共享项目来实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2014-06-10
    • 2011-09-15
    相关资源
    最近更新 更多