1

Ситуация: Клиент отправляет объект на сервер с помощью ObjectOutputStream. I сброс() и сброс() после отправки.Android: объект не получен должным образом с использованием ObjectOutputstream & ObjectInputstream

Сервер принимает и объект, выполняет некоторую обработку и отправляет его обратно клиенту. Сразу же после отправки я вызываю ObjectOutputStream.reset(). Перед отправкой я также распечатаю поле в этом объекте в консоли.

Клиент получает тот же объект обратно с сервера, используя ObjectInputStream().

Задача: После получения объекта обратно у клиента поле, напечатанное на консоли сервера, теперь печатает NULL.

То, что я пробовал: Я использую flush() и reset() после отправки и получения с обоих концов.

Почему полученный объект поврежден?

Клиентский код - беги() ниток: Код

   objectOutputStream.flush(); 
        objectOutputStream.reset(); 

        //out.println("#SerialO#"); 
        objectOutputStream.writeBoolean(true); 


        if(((Dodger) this.obj).getRemotable()){ 

          Log.i("ENDPOINT", "Sending Serialized ObjecInstance ..."); 
          objectOutputStream.writeObject(this.obj); 
          objectOutputStream.flush(); 
          objectOutputStream.reset(); 
        } 

Client - Функция называется TO получить сервера O/P

 objectOutputStream.writeBoolean(false); 

     objectOutputStream.flush(); 
     objectOutputStream.reset(); 
     objectOutputStream.writeObject(args); 

     objectOutputStream.flush(); 
     objectOutputStream.reset(); 

     res = objectInputStream.readObject(); 

     ...... 
     else if (res instanceof Dodger) 
     { 
      res = (Dodger) res; 
      res3 = (Dodger)res; 
      Log.v("CLIENT", "Object received Dodger "+ctr); 
     } 
     else 
      if(res==null) 
       Log.v("CLIENT", "Object received is NULL "+ctr); 
      else 
       Log.v("CLIENT", "Object received of UNKNOWN Type "+ctr); 

catch (Exception e) 
     { 
      Log.e("CLIENT receive error 3",e.toString()); 
     } 

        // ** ERROR COMES AT THIS LINE. NULL VALUE IS PRINTED ** 
      System.out.println("ENDPOINT GETPOSITION -> "+res3.getPosition()); 

код сервера - основной поток.

flg = mInput.readBoolean();//this.input.readLine().toString(); 

        System.out.println("SERVER Received flg as "+flg); 

        if(flg){ 

         Log.d("SERVER","Received an object"); 
         sendObj = mInput.readObject(); 
         //mOutput.flush(); 
         CommunicationThread commThread = new CommunicationThread(this.clientSocket,it,sendObj); 
         new Thread(commThread).start(); 
        } 
        else //if(flg.equalsIgnoreCase("P")) 
        { 
         Object[] recArgs = (Object[])mInput.readObject(); 

         executor = Executors.newFixedThreadPool(1); 
         executor.submit(new updateUIThread(this.clientSocket, this.msg, recArgs)); 

         //Temp 
         //executor.execute(new updateUIThread(this.clientSocket, this.msg, recArgs)); 
         //break; 
        } 

код сервера - Сообщение Тема: Код

  if (mInput==null){ 
       Log.i("SERVER","Receiving very first serialized obj"); 
       mOutput = new ObjectOutputStream(this.clientSocket.getOutputStream()); 
       System.out.println("Inside Server's Comm Thread 2 "); 
       mInput = new ObjectInputStream(new BufferedInputStream(this.clientSocket.getInputStream())); 
      } 
      { 

       System.out.println("Inside Server's Comm Thread 3 "); 

       if (obj instanceof Dodger) { 
        obj1 = (Dodger)obj; 
        //... 

        System.out.println("Dodger Object Type: " + obj.getClass().getName()); 

       } 
       else { 
        System.out.println("Unexpected object type: " + obj.getClass().getName()); 
       } 

Сервер - updateUIThread:

obj1.setPosition((Vec2)this.recArgs[0]); 

// BELOW IT PRINTS THE PROPER VALUE, BEFORE SENDING BACK TO CLIENT 
    System.out.println("SERVER GETPOSITION "+obj1.getPosition()); 

      mOutput.reset(); 
      mOutput.writeObject(obj1); 
      mOutput.reset(); 
+0

отправьте ваш код пожалуйста – suitianshi

+0

@suitianshi, сделано. Надеюсь, он не слишком длинный, чтобы понять. – Abhishek

+0

Изменен код еще раз. Может ли кто-нибудь предложить решения? – Abhishek

ответ

1

решаемые его. Оказывается, что переменная, возвращаемая из getPosition(), была из класса Super, который НЕ реализовал Serializable. Вот почему, хотя объект вернулся правильно, эта конкретная переменная внутри объекта была «потеряна в пути».

Мораль истории: Всякий раз, когда вы создаете класс Serializable, все его суперклассы также должны реализовывать Serializable !!

+0

Это невозможно, так как объект не является Serializable. Было бы более правильным сказать, что вы не должны полагаться на поля, которые сериализуются, которые не могут быть сериализованы. – EJP

+0

Да, я имел в виду пользовательский объект. – Abhishek

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