2014-11-27 3 views
0

Что я пытаюсь сделать, так это отправить и ArrayList через сокет от Android-клиента до сервера Java. Вот код клиента, который посылает ArrayList:Отправка ArrayList <Object> через гнездо. Java

private void sendContacts(){ 
      AppHelper helperClass = new AppHelper(getApplicationContext()); 
      final ArrayList<Person> list = helperClass.getContacts(); 
      System.out.println("Lenght of an contacts array : " +list.size()); 
//   for (Person person : list) { 
//    System.out.println("Name "+person.getName()+"\nNumber "+ person.getNr()); 
//   } 
      handler.post(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        try { 
//**151 line**    os.writeObject(list); 
        os.flush(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        Log.e(TAG, "Sending Contact list has failed"); 
        e.printStackTrace(); 
       } 
      } 
      }); 
} 

public ArrayList<Person> getContacts() { 
     ArrayList<Person> alContacts = null; 
     ContentResolver cr = mContext.getContentResolver(); //Activity/Application android.content.Context 
     Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
     if(cursor.moveToFirst()) 
     { 
      alContacts = new ArrayList<Person>(); 
      do 
      { 
       String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 

       if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
       { 
        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{ id }, null); 
        while (pCur.moveToNext()) 
        { 
         String contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         String contactName = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
         Person temp = new Person(contactName, contactNumber); 

         alContacts.add(temp); 
         break; 
        } 
        pCur.close(); 
       } 

      } while (cursor.moveToNext()) ; 
     } 
     return alContacts; 
    } 

Вот код сервера:

private void whileChatting() throws IOException { 
     ableToType(true); 
     String message = "You are now connected "; 
     sendMessage(message); 
     do {// have conversation 
      try { 
       message = (String) input.readObject(); 
       // message = (String) input.readLine(); 
       showMessage("\n" + message); 
      } catch (ClassNotFoundException e) { 
       showMessage("It is not a String\n"); 

       // TODO: handle exception 
      } 
      try{ 
       ArrayList<Person> list =(ArrayList<Person>) input.readObject(); 
       showMessage("GOT A LIST OF PERSON WITH SIZE :" + list.size()); 
      }catch(ClassNotFoundException e){ 
       showMessage("It is not a List of Person\n"); 
      } 
     } while (!message.equals("client - end")); 
    } 

Код ошибки:

Caused by: java.io.NotSerializableException: com.lauris.client.Person 
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344) 
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 
    at java.util.ArrayList.writeObject(ArrayList.java:648) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1033) 
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384) 
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 
    **at com.lauris.client.MainActivity$ClientThread$4.run(MainActivity.java:151)** 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5221) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Я думаю, что моя проблема сериализации? Я не понимаю смысл этого? Может кто-нибудь объяснить мне, что это такое, зачем мне это нужно? И как я могу исправить свой код?

Дополнительный вопрос. Вы можете увидеть в моем коде im, пытаясь слушать разные InputStreams. Я думаю, я делаю это неправильно. Может ли кто-нибудь более продвинутый объяснить мне, как это сделать правильно?

Цените свою помощь, я действительно застрял на этом.

+0

«Лицо» не является сериализуемым, то есть не реализует интерфейс «Serializable». –

+0

как я могу это сделать в моем случае? – Lauris01

+0

перейдите к классу 'Person' и добавьте' реализует Serializable' –

ответ

0

Person класс должен implement Serializable:

import java.io.Serializable; 

public class Person implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

} 
+0

Я сделал это сериализуемым, но я не могу получить его на сервере. Почему это могло произойти? – Lauris01

+0

Все еще такая же проблема. – Lauris01

0

Да:

-> Пусть он реализует Serializable; -> Разумно назначить случайный SerialVersionUID.

Помимо сериализации, вы можете рассмотреть XML-сериализацию (проверьте API Java). XML более читабельна и лучше переносима (например, между виртуальными машинами).

+0

Нравится это? Https: //docs.oracle.com/javase/7/docs/api/java/beans/XMLEncoder.html – Lauris01

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