Search code examples
javaandroidclasscastexceptionobjectoutputstreamobjectinputstream

ClassCastException in Android when trying to read in from ObjectInputStream


I've got a problem with an android application I'm working on. I've got two phones connected through Wi-Fi and I pass a custom serialized class from one phone to the other using ObjectOutputStream / ObjectInputStream. The classes on the two phones are identical but when I try to read on one phone I get a ClassCastException.

07-19 08:19:41.636: E/ClientActivity(1775): java.lang.ClassCastException: sMessage
07-19 08:19:41.636: E/ClientActivity(1775):     at     com.example.nfcclientv2.ClientService.runService(ClientService.java:87)
07-19 08:19:41.636: E/ClientActivity(1775):     at com.example.nfcclientv2.ClientService.onStartCommand(ClientService.java:66)
07-19 08:19:41.636: E/ClientActivity(1775):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2043)
07-19 08:19:41.636: E/ClientActivity(1775):     at android.app.ActivityThread.access$2800(ActivityThread.java:117)
07-19 08:19:41.636: E/ClientActivity(1775):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998)
07-19 08:19:41.636: E/ClientActivity(1775):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-19 08:19:41.636: E/ClientActivity(1775):     at android.os.Looper.loop(Looper.java:130)
07-19 08:19:41.636: E/ClientActivity(1775):     at android.app.ActivityThread.main(ActivityThread.java:3691)
07-19 08:19:41.636: E/ClientActivity(1775):     at java.lang.reflect.Method.invokeNative(Native Method)
07-19 08:19:41.636: E/ClientActivity(1775):     at java.lang.reflect.Method.invoke(Method.java:507)
07-19 08:19:41.636: E/ClientActivity(1775):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
07-19 08:19:41.636: E/ClientActivity(1775):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
07-19 08:19:41.636: E/ClientActivity(1775):     at dalvik.system.NativeStart.main(Native Method)

I read in the object and the line that the error happens on:

sMessage sMsg = (sMessage)ois.readObject();

Here's how I write out the sMessage:

oos = new ObjectOutputStream(client.getOutputStream());
oos.writeObject(sMsg);
oos.flush();
oos.close();

and here's my sMessage class:

import java.io.Serializable;

public class sMessage implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public String type = null;
    public byte[] data = null;
};

I have this class on both phones and as I said they are identical so I'm not quite sure why I'm getting a ClassCastException.

If anymore information would help, I'd be happy to post it and any help is appreciated.


Solution

  • Well, I'm not entirely sure what the exact problem was but in my case I checked the class of the object coming in from the ObjectInputStream and it was including the full package name of my class so I changed my cast from just "(sMessage)oid.readObject()" to "(packageName + sMessage)oid.readObject()". It should also be noted that these classes are in separate applications but have the same package name.

    Hope that helps someone.