通过意图在活动之间传递自定义对象时出错

Posted

技术标签:

【中文标题】通过意图在活动之间传递自定义对象时出错【英文标题】:Error passing custom object between activities through intent 【发布时间】:2018-01-05 23:14:05 【问题描述】:

我尝试通过在 CustomObject 上实现 Serializable 将这个简单的对象从 MainActivity 传递到 Main2Activity。它导致错误。我提到了类似的堆栈溢出问题。没有任何帮助。

public class MainActivity extends Activity 
    String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent i = new Intent(this,Main2Activity.class);
    Bundle bundle = new Bundle();
    bundle.putSerializable("data",new CustomObject());
//I tried i.putExtra(bundle);
    i.putExtra("data",new CustomObject());
    startActivity(i);
    Log.d(TAG, "onCreate: ");


public class CustomObject implements Serializable
    public int i = 0;
    public int j = 9;
    CustomObject()

    


Main2Activity

public class Main2Activity extends Activity 
String TAG = "Main2Activity";

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Intent i = getIntent();
    MainActivity.CustomObject c = (MainActivity.CustomObject)i.getSerializableExtra("data");
    Log.d(TAG, "onCreate: "+c.i+" "+c.j);


错误信息:

07-30 13:58:58.352 26489-26489/? E/androidRuntime:致命异常: 主要的 进程:gct.venkatesh.com.scrshtrebuilt,PID:26489 java.lang.RuntimeException:无法启动活动 组件信息gct.venkatesh.com.scrshtrebuilt/gct.venkatesh.com.scrshtrebuilt.MainActivity: java.lang.RuntimeException: Parcelable遇到IOException写 可序列化对象(名称 = gct.venkatesh.com.scrshtrebuilt.MainActivity$CustomObject) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2684) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2751) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6186) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 引起:java.lang.RuntimeException: Parcelable遇到IOException写 可序列化对象(名称 = gct.venkatesh.com.scrshtrebuilt.MainActivity$CustomObject) 在 android.os.Parcel.writeSerializable(Parcel.java:1527) 在 android.os.Parcel.writeValue(Parcel.java:1475) 在 android.os.Parcel.writeArrayMapInternal(Parcel.java:724) 在 android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1417) 在 android.os.Bundle.writeToParcel(Bundle.java:1157) 在 android.os.Parcel.writeBundle(Parcel.java:764) 在 android.content.Intent.writeToParcel(Intent.java:8703) 在 android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3082) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1520) 在 android.app.Activity.startActivityForResult(Activity.java:4229) 在 android.app.Activity.startActivityForResult(Activity.java:4187) 在 android.app.Activity.startActivity(Activity.java:4526) 在 android.app.Activity.startActivity(Activity.java:4494) 在 gct.venkatesh.com.scrshtrebuilt.MainActivity.onCreate(MainActivity.java:21) 在 android.app.Activity.performCreate(Activity.java:6684) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2637) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2751) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6186) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 引起:java.io.NotSerializableException: gct.venkatesh.com.scrshtrebuilt.MainActivity 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1224) 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 在 android.os.Parcel.writeSerializable(Parcel.java:1522) 在 android.os.Parcel.writeValue(Parcel.java:1475) 在 android.os.Parcel.writeArrayMapInternal(Parcel.java:724) 在 android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1417) 在 android.os.Bundle.writeToParcel(Bundle.java:1157) 在 android.os.Parcel.writeBundle(Parcel.java:764) 在 android.content.Intent.writeToParcel(Intent.java:8703) 在 android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3082) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1520) 在 android.app.Activity.startActivityForResult(Activity.java:4229) 在 android.app.Activity.startActivityForResult(Activity.java:4187) 在 android.app.Activity.startActivity(Activity.java:4526) 在 android.app.Activity.startActivity(Activity.java:4494) 在 gct.venkatesh.com.scrshtrebuilt.MainActivity.onCreate(MainActivity.java:21) 在 android.app.Activity.performCreate(Activity.java:6684) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2637) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2751) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6186) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

【问题讨论】:

【参考方案1】:

由于日志中的此错误:

java.io.NotSerializableException: gct.venkatesh.com.scrshtrebuilt.MainActivity at

MainActivity 不是可序列化,我认为平台希望MainActivity 可序列化,因为CustomObjectMainActivity 中的内部类,

尝试在单独的本地类(单独的文件)中定义您的 CustomObject

【讨论】:

效果很好。但我有一个疑问。当我尝试序列化自定义对象并将其作为广播发送时,即使外部类没有实现可序列化,它也能正常工作。为什么在将它发送到另一个活动时它是不可序列化的。另请注意,当我将对象作为广播发送时,我是从服务发送的。即使从服务 startActivity(intent) 也不序列化 @Venkatesh 你如何在广播中发送它?你用同样的方法putSerializable() 吗? 这也可能与 Activity 有关,因为 MainActivity 扩展了它,但在您的其他情况下,您的外部类扩展了什么(如果它扩展了什么?)我不确定 只是猜测 :) 是的,使用了相同的 putSerializable()。它工作得很好。外部类是 Service 的子类。

以上是关于通过意图在活动之间传递自定义对象时出错的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 Serializable 出错时,如何使用意图传递自定义对象列表

通过 Intent 传递自定义对象列表

自定义可序列化对象数组列表的意图错误

如何通过 kotlin 中的意图传递自定义对象

Android将自定义对象从服务传递给活动

切换活动而不会丢失自定义数据