简体   繁体   中英

Sending ArrayList<Object> through socket. Java

What i'm trying to do is to send and ArrayList through a socket from Android client to Java server. Here is the code of client which sends the ArrayList :

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;
    }

Here is the server code:

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"));
    }

Error code :

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)

I guess my problem is serialization ? I don't really understand the meaning of this ? Can somebody explain me what it is, why i need it? And how may i fix my code?

Additional question. You can see in my code im trying to listen for different InputStreams. I think i,m doing it wrong. Could somebody more advanced explain me how to do it correct ?

Appreciate your help, i'm really stuck on this.

The Person class must implement Serializable :

import java.io.Serializable;

public class Person implements Serializable {

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

}

Yes:

-> Let it implements Serializable; -> It is wise to assign a random SerialVersionUID.

Beside serialization, you might conside XML Serialization (check Java API). XML is more readable and better portable (eg between VMs).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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