2012-03-17 39 views
0

在回答我最后一个问题之后,我把这个事情改写成最简单的形式。 1个按钮,1个clicklistener,1个可序列化的对象和1个子例程以输出可序列化的对象。这段代码是基于我在这里找到的大约6-8个例子。然而,它仍然如此简单,它仍然产生这个错误:W/System.err(228):java.io.NotSerializableException:serobj.testActivity 所以我挑战你,哦,所以明智的代码大师:为什么这个代码会产生这个错误?最重要的是我该如何解决这个问题? 整个代码,然后日志输出中:为什么这个简单的可序列化对象抛出NotSerializableException?

package serobj; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import ser.obj.R; 
import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 


public class testActivity extends Activity { 
/** Called when the activity is first created. */ 
public class Tester implements Serializable{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
public String frog; 
    public Tester(){ 
     frog="frog"; 
    } 

} 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
Button button1 = (Button) findViewById(R.id.button1); 
button1.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     Testit(); 
    } 
}); 
} 
public void Testit(){ 
     Tester test = new Tester(); 

    FileOutputStream fos; 
    try { 
     fos =openFileOutput("test.fyl", Context.MODE_WORLD_READABLE); 
     Log.d("file open","..."); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     Log.d("ObjOutStr","..."); 
     oos.writeObject(test); 
     Log.d("tried wO","..."); // never gets here... 
     oos.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     Log.d ("filenotfound", "filenotfound"); 
    }catch(IOException e){ 
     e.printStackTrace(); 
     Log.d("ioexception", "ioexception"); 
    } 

} 

}

03-17 04:40:02.691: D/file open(228): ... 
03-17 04:40:02.701: D/ObjOutStr(228): ... 
03-17 04:40:02.961: W/System.err(228): java.io.NotSerializableException: serobj.testActivity 
03-17 04:40:02.971: W/System.err(228): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1547) 
03-17 04:40:02.971: W/System.err(228): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1854) 
03-17 04:40:02.971: W/System.err(228): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1696) 
03-17 04:40:02.971: W/System.err(228): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1660) 
03-17 04:40:02.971: W/System.err(228): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153) 
03-17 04:40:02.971: W/System.err(228): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420) 
03-17 04:40:02.981: W/System.err(228): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251) 
03-17 04:40:02.981: W/System.err(228): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587) 
03-17 04:40:02.981: W/System.err(228): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1854) 
03-17 04:40:02.981: W/System.err(228): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1696) 
03-17 04:40:02.981: W/System.err(228): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1660) 
03-17 04:40:02.981: W/System.err(228): at serobj.testActivity.Testit(testActivity.java:50) 
03-17 04:40:03.015: W/System.err(228): at serobj.testActivity$1.onClick(testActivity.java:37) 
03-17 04:40:03.015: W/System.err(228): at android.view.View.performClick(View.java:2364) 
03-17 04:40:03.015: W/System.err(228): at android.view.View.onTouchEvent(View.java:4179) 
03-17 04:40:03.015: W/System.err(228): at android.widget.TextView.onTouchEvent(TextView.java:6541) 
03-17 04:40:03.015: W/System.err(228): at android.view.View.dispatchTouchEvent(View.java:3709) 
03-17 04:40:03.015: W/System.err(228): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-17 04:40:03.021: W/System.err(228): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-17 04:40:03.021: W/System.err(228): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-17 04:40:03.021: W/System.err(228): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-17 04:40:03.021: W/System.err(228): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-17 04:40:03.021: W/System.err(228): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
03-17 04:40:03.021: W/System.err(228): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
03-17 04:40:03.021: W/System.err(228): at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
03-17 04:40:03.021: W/System.err(228): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
03-17 04:40:03.021: W/System.err(228): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
03-17 04:40:03.021: W/System.err(228): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-17 04:40:03.031: W/System.err(228): at android.os.Looper.loop(Looper.java:123) 
03-17 04:40:03.031: W/System.err(228): at android.app.ActivityThread.main(ActivityThread.java:4363) 
03-17 04:40:03.031: W/System.err(228): at java.lang.reflect.Method.invokeNative(Native Method) 
03-17 04:40:03.031: W/System.err(228): at java.lang.reflect.Method.invoke(Method.java:521) 
03-17 04:40:03.031: W/System.err(228): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
03-17 04:40:03.031: W/System.err(228): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
03-17 04:40:03.031: W/System.err(228): at dalvik.system.NativeStart.main(Native Method) 
03-17 04:40:03.031: D/ioexception(228): ioexception 
03-17 04:51:21.861: D/dalvikvm(56): threadid=15: bogus mon 1+0>0; adjusting 

回答

8

是导致你的内部类也不是一成不变的,所以作为一个序列化的东西存在,这将需要outter类的实例并且活动不可序列化。让Tester成为一个单独的类,或者将其作为一个静态的内部类。

+0

有趣的是,它被简单忽略的东西很简单。谢谢你的迅速回复,Snicolas,完美的工作。 – 2012-03-17 16:39:58

+0

只是想分享,在我的一个类(它实现Serializable)我有一个内部接口(静态)。我有相同的NotSerializableException。看着你的ans我最终使它扩展了Serializable并解决了这个问题。 – user2720864 2013-10-21 13:50:35

相关问题