使用ObjectInputStream的Android ClassNotFoundException

时间:2012-04-21 19:48:14

标签: java android classnotfoundexception objectinputstream

我正在尝试将一个对象从服务器应用程序发送到Android客户端。所有类都在eclipse中的同一个包和src文件夹中,包括引起ClassNotFoundException的那个:CardGame。我是Android的新手,对java很新,并且已经坚持了几天,所以我想知道是否有人能够帮我弄清问题是什么......

以下是导致问题的代码......

CardGame game = (CardGame) in.readObject();

这是堆栈跟踪......

04-21 19:21:35.608: W/System.err(482): java.lang.ClassNotFoundException: CardGame
04-21 19:21:35.618: W/System.err(482):  at java.lang.Class.classForName(Native Method)
04-21 19:21:35.618: W/System.err(482):  at java.lang.Class.forName(Class.java:235)
04-21 19:21:35.618: W/System.err(482):  at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2590)
04-21 19:21:35.618: W/System.err(482):  at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1846)
04-21 19:21:35.618: W/System.err(482):  at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:826)
04-21 19:21:35.618: W/System.err(482):  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2066)
04-21 19:21:35.618: W/System.err(482):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:929)
04-21 19:21:35.628: W/System.err(482):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2285)
04-21 19:21:35.628: W/System.err(482):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2240)
04-21 19:21:35.628: W/System.err(482):  at com.client.activity.play.init(play.java:107)
04-21 19:21:35.628: W/System.err(482):  at com.client.activity.play.onCreate(play.java:54)
04-21 19:21:35.628: W/System.err(482):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-21 19:21:35.628: W/System.err(482):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-21 19:21:35.628: W/System.err(482):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-21 19:21:35.628: W/System.err(482):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-21 19:21:35.628: W/System.err(482):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-21 19:21:35.638: W/System.err(482):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-21 19:21:35.638: W/System.err(482):  at android.os.Looper.loop(Looper.java:123)
04-21 19:21:35.638: W/System.err(482):  at android.app.ActivityThread.main(ActivityThread.java:4627)
04-21 19:21:35.638: W/System.err(482):  at java.lang.reflect.Method.invokeNative(Native Method)
04-21 19:21:35.638: W/System.err(482):  at java.lang.reflect.Method.invoke(Method.java:521)
04-21 19:21:35.638: W/System.err(482):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-21 19:21:35.638: W/System.err(482):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-21 19:21:35.648: W/System.err(482):  at dalvik.system.NativeStart.main(Native Method)
04-21 19:21:35.648: W/System.err(482): Caused by: java.lang.NoClassDefFoundError: CardGame
04-21 19:21:35.648: W/System.err(482):  ... 24 more
04-21 19:21:35.658: W/System.err(482): Caused by: java.lang.ClassNotFoundException: CardGame in loader dalvik.system.PathClassLoader[/data/app/com.client.activity-1.apk]
04-21 19:21:35.658: W/System.err(482):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
04-21 19:21:35.668: W/System.err(482):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
04-21 19:21:35.668: W/System.err(482):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
04-21 19:21:35.668: W/System.err(482):  ... 24 more

谢谢!

3 个答案:

答案 0 :(得分:3)

事实证明,通过ObjectOutputStream发送的对象的类在服务器和客户端设备上必须具有相同的包名。这似乎解决了我的问题。感谢大家的帮助。

答案 1 :(得分:1)

值得注意的是,不同VM(例如Android的Delvik和Sun JVM)之间的序列化可能不兼容。

我建议如果你进行服务器/ Android通信,那么你应该依赖XML或JSON之类的东西(我更喜欢后者,并且有一些Android类可以让它更容易)

请参阅:http://developer.android.com/reference/org/json/JSONObject.html

答案 2 :(得分:0)

如果没有能够看到你的Eclipse设置就很难说更多,但是这个错误表明你的CardGame类并没有最终将包装到正在构建的APK中。

是Android项目中的那个类还是在Server项目中?如果它在服务器项目中,请确保Android项目正在引用该项目,并且您的CardGame类正在正确导出并在该项目中可见。

如果您使用以下行查看Eclipse中的源代码:

CardGame game = (CardGame) in.readObject();

是否发现CardGame好吗?如果没有,那么你的类路径设置是不好的。如果是,那么Android构建在构建APK时不会提取所有必要的资源。