I have to send an ArrayList of BasicNameValuePairs to another Activity in my Android app. First it did not allow me to do this, saying BasicNameValuePair is not serializable.
So after reading a few other answers, I followed their recommendations made my own class called SerializedNameValuePair which implements serializable, and thought of passing an ArrayList of this.
public class SerializedNameValuePair implements Serializable, NameValuePair{
    private BasicNameValuePair nvp;
    public SerializedNameValuePair(String name, String value){
        nvp=new BasicNameValuePair(name, value);
    }
     @Override
        public String getName() {
            return nvp.getName();
        }
        @Override
        public String getValue() {
            return nvp.getValue();
        }
        // serialization support
        private static final long serialVersionUID = 1L;
        private void writeObject(ObjectOutputStream out) throws IOException {
            out.writeChars(nvp.getName());
            out.writeChars(nvp.getValue());
        }
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            nvp = new BasicNameValuePair(in.readUTF(), in.readUTF());
        }
        @SuppressWarnings("unused")
        private void readObjectNoData() throws ObjectStreamException {
            // nothing to do
        }
}
Then i make an ArrayList of this and try passing it in an Intent.
places is declared as a variable of ShipmentFindingActivity itself.
ArrayList <SerializedNameValuePair>places;
In the postExecute of an AsyncTask I initialize it.
places=new ArrayList<SerializedNameValuePair>();
Then I populate the ArrayList in a for loop.
SerializedNameValuePair nvp=new SerializedNameValuePair(eventname, placename);
places.add(nvp);
There is a button that has it's visibility set to invisible first. After the postExecute executes, it becomes visible and it's onClick is openMap.
public void openMap(View view){
    System.out.println("Map View Button Pressed");
    Intent intent=new Intent(context, MapViewingActivity.class);
    intent.putExtra("places", places);
    startActivity(intent);
}
Here the app crashes when i click on the button. I am receiving the intent in MapViewingActivity like this:
Intent intent=getIntent();
nameValuePairs=(ArrayList<SerializedNameValuePair>) intent.getSerializableExtra("nvp");
When the app crashes this is what I get in LogCat:
06-04 06:39:13.546: E/AndroidRuntime(2733): FATAL EXCEPTION: main
06-04 06:39:13.546: E/AndroidRuntime(2733): Process: com.example.tradeapp, PID: 2733
06-04 06:39:13.546: E/AndroidRuntime(2733): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tradeapp/com.example.tradeapp.MapViewingActivity}: java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object (name = com.example.tradeapp.SerializedNameValuePair)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Handler.dispatchMessage(Handler.java:102)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Looper.loop(Looper.java:136)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.app.ActivityThread.main(ActivityThread.java:5017)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.lang.reflect.Method.invokeNative(Native Method)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.lang.reflect.Method.invoke(Method.java:515)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at dalvik.system.NativeStart.main(Native Method)
06-04 06:39:13.546: E/AndroidRuntime(2733): Caused by: java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object (name = com.example.tradeapp.SerializedNameValuePair)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Parcel.readSerializable(Parcel.java:2215)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Parcel.readValue(Parcel.java:2064)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Parcel.readListInternal(Parcel.java:2343)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Parcel.readArrayList(Parcel.java:1703)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Parcel.readValue(Parcel.java:2034)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Bundle.unparcel(Bundle.java:249)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Bundle.getSerializable(Bundle.java:1295)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.content.Intent.getSerializableExtra(Intent.java:4694)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at com.example.tradeapp.MapViewingActivity.onCreate(MapViewingActivity.java:38)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.app.Activity.performCreate(Activity.java:5231)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
06-04 06:39:13.546: E/AndroidRuntime(2733):     ... 11 more
06-04 06:39:13.546: E/AndroidRuntime(2733): Caused by: java.io.EOFException
06-04 06:39:13.546: E/AndroidRuntime(2733):     at libcore.io.Streams.readFully(Streams.java:83)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.DataInputStream.readFully(DataInputStream.java:99)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.DataInputStream.decodeUTF(DataInputStream.java:178)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.DataInputStream.decodeUTF(DataInputStream.java:173)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.DataInputStream.readUTF(DataInputStream.java:169)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:2113)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at com.example.tradeapp.SerializedNameValuePair.readObject(SerializedNameValuePair.java:41)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.lang.reflect.Method.invokeNative(Native Method)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.lang.reflect.Method.invoke(Method.java:515)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1332)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
06-04 06:39:13.546: E/AndroidRuntime(2733):     at android.os.Parcel.readSerializable(Parcel.java:2213)
06-04 06:39:13.546: E/AndroidRuntime(2733):     ... 23 more
Any ideas how to fix?
 
     
    