【问题标题】:Java Serializable Object not being received or sent to client android applicationJava Serializable Object 未被接收或发送到客户端 android 应用程序
【发布时间】:2015-08-09 12:18:49
【问题描述】:

我的 Java 服务器运行一个线程,它简单地创建一个带有四个参数的订单对象。然后这个 Object 通过 ObjectOutputStream 发送,调用 writeObject() 方法(Order 实现 Serializable)。我不确定手头的问题,因为在客户端没有读取/接收对象。我用一个字符串对象测试了这个函数,它工作得很好。我相信它可能与我的 Order 类实现有关。我已提供以下代码供审核:

订单类

public class Order implements java.io.Serializable{
    private static final long serialVersionUID = 345634l;
    String cuisine;
    String description;
    int min = 0;
    int max = 0;

    public Order(String cuis,String descr,int min,int max){
        cuisine = cuis;
        description = descr;
        this.min = min;
        this.max = max;
    }

    public void setCuisine(String c){
        cuisine = c;
    }

    public String getCuisine(){
        return cuisine;
    }

    public void setDescription(String d){
        description = d;
    }

    public String getDescription(){
        return description;
    }

    public void setMinPrice(int c){
        min = c;
    }

    public int getMin(){
        return min;
    }

    public void setMac(int x){
        max = x;
    }

    public int getMax(){
        return max;
    }

    @Override
    public String toString(){
        return cuisine + "\n" + description + "\n" + min + "\n" + max + "\n" + "$";
    }
}

ListSender 线程(服务器端)

class ListSender extends Thread {

    @Override
    public void run() {
        while (true) {                
            try {                 
                ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
                Order r = new Order("Indian","Spicy Madras",4,9);
                orderList.add(r);
                oos.writeObject(r);
                oos.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

MessageHandler 线程(Android 客户端)

class MessageHandler extends AsyncTask<Void,Void,Void> {
            int orderHead = 0;
            String item = "";

            public Void doInBackground(Void... param){
                try{
                    serverAddr = InetAddress.getByName(ipAddress);
                    socket = new Socket(serverAddr,portNumber);
                    ObjectInputStream ois = new  ObjectInputStream(socket.getInputStream());
                    Order e = (Order) ois.readObject();
                    onPostExecute(e.toString());
                } catch(ClassNotFoundException e) {
                    e.printStackTrace();
                } catch(IOException e){
                    e.printStackTrace();
                }
                return null;
            }

        public void onPostExecute(String s){
            foodList += s + "\n";
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    try{
                        message.setText(foodList);
                    }catch(Exception e){

                    }
                }
            });
        }
    }

我希望这些信息足以让任何人分析并可能解释此代码的替代或改进版本。

【问题讨论】:

  • 你应该在 finally 块中关闭你的输出...你如何通知你的处理程序,有新的信息?
  • 这段代码是否真的被执行了?难以置信。但无论如何,在套接字的生命周期内,您应该在每一端使用一个对象流,而不是每条消息一个新的对象流。
  • 是的,代码正在执行并且运行没有错误。我添加了 close() 方法,但抛出了 SocketException。

标签: java android serialization


【解决方案1】:

找到的解决方案:

确保序列化中使用的所有远程类也应具有相同的包名。

【讨论】:

  • 所以你得到了一个例外并且没有费心在问题中提及它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多