繁体   English   中英

Android / Java - 用于ServerSocket和Socket通信的ClassNotFoundException

[英]Android/Java - ClassNotFoundException for ServerSocket and Socket communication

我正在开发一个应用程序,其中手机(Android程序)是客户端试图通过套接字将数据发送到我的计算机上的Java接收器程序。

到目前为止,我已经能够发送简单的字符串或其他任何东西,但现在我正在尝试发送我创建的自定义对象。 我应该注意,这两个程序都是单独的Eclipse项目,我似乎在服务器端包含相同的自定义类“Order”时遇到问题(即使我在服务器项目的src文件夹中有Order.java)。

一些代码,供参考:服务器:

private void run() throws Exception {

    ServerSocket mySS = new ServerSocket(4443);     

    while(true) {

        Socket SS_accept = mySS.accept(); 

        InputStream is = SS_accept.getInputStream();  
        ObjectInputStream ois = new ObjectInputStream(is);  
        Order order = (Order) ois.readObject();  

        if (order!=null){
            java.util.List<String> items = order.getOrders(); 
            int chair = order.getChair();
            int table = order.getTable(); 
            double price = order.getPrice(); 
            System.out.println("Table: "+ table + " || Chair: " +chair);
            for(String food: items) {
                System.out.println(food); 
            }
            System.out.println("Price: $"+price); 

        }  
        is.close();  
        SS_accept.close();  
        mySS.close();

}

以及客户的相关部分:

try {
        mySocket = new Socket(serverService.ipAddress, serverService.port);
        os = mySocket.getOutputStream();  
        oos = new ObjectOutputStream(os);  
    } catch(Exception e) {
        Toast.makeText(PlaceOrder.this, "Error - not connected to server.", Toast.LENGTH_SHORT).show(); 
    }

try {
                oos.writeObject(order);
                Toast.makeText(PlaceOrder.this, "Order Submitted!", Toast.LENGTH_SHORT).show(); 
                refreshOrderPage(); //refresh page, allow waiter to make more orders
                oos.close();  
                os.close(); 
                mySocket.close(); 
            } catch (Exception e) {
                Toast.makeText(PlaceOrder.this, "Error - not connected to server.", Toast.LENGTH_SHORT).show();
            } 

尝试通过套接字发送对象时,为什么我收到此错误的任何想法?

谢谢。

您应该在类中设置serialVersionUID ,然后使用共享类构建一个jar并在两个项目中包含该jar。

但是,如果您使用不同的JVM(Oracle和Dalvik),则无法保证字节级编码是相同的。 您应该使用readObject / writeObject手动覆盖序列化,或者使用保证独立于环境的相同的不同对象编码系统。

堆栈跟踪会有所帮助,但几乎可以肯定,您将一侧的对象序列化,将其发送给另一侧,另一侧没有可以重构对象的类定义。 在这种情况下,听起来可能是您的服务器不知道com.foo.Order类。

您还可以将对象序列化为某种字符串格式(json,yaml,xml)并传递它。 我想,维护起来要容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM