【问题标题】:java.io.NotSerializableException while passing interface through intent.putExtrajava.io.NotSerializableException 通过intent.putExtra 传递接口
【发布时间】:2018-02-14 09:44:32
【问题描述】:

这是我从 Serializable 扩展而来的接口:

public interface InstaListener extends Serializable {
    void onSuccess(String response);
    void onFailure(int code, String reason);
}

这是我在两个活动之间传递此侦听器的方式:

InstaListener iListener = new InstaListener() {
            @Override
            public void onSuccess(String response) {

            }

            @Override
            public void onFailure(int code, String reason) {

            }
        };

Intent intent = new Intent(activity, Insta.class);
            intent.putExtra("email", email);
            intent.putExtra("phone", phone);
            intent.putExtra("purpose", purpose);
            intent.putExtra("amount", amountstr);
            intent.putExtra("name", name);
            intent.putExtra("env", env);
            intent.putExtra("listener", iListener);
            activity.startActivity(intent);

这是我在 Insta 课程中接收听众的方式。

instaListener = (InstaListener) getIntent().getSerializableExtra("listener");

我搜索了很多帖子,但没有任何解释我收到错误的原因: java.io.NotSerializableException

有什么帮助吗?

编辑 发布异常和堆栈跟踪

FATAL EXCEPTION: main
                                                                 Process: instamojo.testapp, PID: 6785
                                                                 java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = instamojo.library.InstamojoPay$1)
                                                                     at android.os.Parcel.writeSerializable(Parcel.java:1527)
                                                                     at android.os.Parcel.writeValue(Parcel.java:1475)
                                                                     at android.os.Parcel.writeArrayMapInternal(Parcel.java:724)
                                                                     at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
                                                                     at android.os.Bundle.writeToParcel(Bundle.java:1157)
                                                                     at android.os.Parcel.writeBundle(Parcel.java:764)
                                                                     at android.content.Intent.writeToParcel(Intent.java:8687)
                                                                     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3271)
                                                                     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1691)
                                                                     at android.app.Activity.startActivityForResult(Activity.java:4291)
                                                                     at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
                                                                     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
                                                                     at android.app.Activity.startActivityForResult(Activity.java:4249)
                                                                     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
                                                                     at android.app.Activity.startActivity(Activity.java:4603)
                                                                     at android.app.Activity.startActivity(Activity.java:4563)
                                                                     at instamojo.library.InstamojoPay.initInstamojo(InstamojoPay.java:61)
                                                                     at instamojo.library.InstamojoPay.start(InstamojoPay.java:34)
                                                                     at instamojo.testapp.MainActivity.callInstamojoPay(MainActivity.java:58)
                                                                     at instamojo.testapp.MainActivity.access$000(MainActivity.java:17)
                                                                     at instamojo.testapp.MainActivity$1.onClick(MainActivity.java:39)
                                                                     at android.view.View.performClick(View.java:5669)
                                                                     at android.view.View$PerformClick.run(View.java:22549)
                                                                     at android.os.Handler.handleCallback(Handler.java:751)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                     at android.os.Looper.loop(Looper.java:154)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:6290)
                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                  Caused by: java.io.NotSerializableException: instamojo.library.InstamojoPay
                                                                     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1224)
                                                                     at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584)
                                                                     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549)
                                                                     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472)
                                                                     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218)
                                                                     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
                                                                     at android.os.Parcel.writeSerializable(Parcel.java:1522)
                                                                     at android.os.Parcel.writeValue(Parcel.java:1475) 
                                                                     at android.os.Parcel.writeArrayMapInternal(Parcel.java:724) 
                                                                     at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408) 
                                                                     at android.os.Bundle.writeToParcel(Bundle.java:1157) 
                                                                     at android.os.Parcel.writeBundle(Parcel.java:764) 
                                                                     at android.content.Intent.writeToParcel(Intent.java:8687) 
                                                                     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3271) 
                                                                     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1691) 
                                                                     at android.app.Activity.startActivityForResult(Activity.java:4291) 
                                                                     at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) 
                                                                     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) 
                                                                     at android.app.Activity.startActivityForResult(Activity.java:4249) 
                                                                     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 
                                                                     at android.app.Activity.startActivity(Activity.java:4603) 
                                                                     at android.app.Activity.startActivity(Activity.java:4563) 
                                                                     at instamojo.library.InstamojoPay.initInstamojo(InstamojoPay.java:61) 
                                                                     at instamojo.library.InstamojoPay.start(InstamojoPay.java:34) 
                                                                     at instamojo.testapp.MainActivity.callInstamojoPay(MainActivity.java:58) 
                                                                     at instamojo.testapp.MainActivity.access$000(MainActivity.java:17) 
                                                                     at instamojo.testapp.MainActivity$1.onClick(MainActivity.java:39) 
                                                                     at android.view.View.performClick(View.java:5669) 
                                                                     at android.view.View$PerformClick.run(View.java:22549) 
                                                                     at android.os.Handler.handleCallback(Handler.java:751) 
                                                                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                     at android.os.Looper.loop(Looper.java:154) 
                                                                     at android.app.ActivityThread.main(ActivityThread.java:6290) 
                                                                     at java.lang.reflect.Method.invoke(Native Method) 
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

【问题讨论】:

  • 在您的问题中发布整个异常和堆栈跟踪。
  • 编辑并添加异常和堆栈跟踪

标签: android serialization interface deserialization


【解决方案1】:

你有一个instamojo.library.InstamojoPay 的内部类,它不可序列化。

为避免此异常,请将java.io.Serializable 添加到您的内部类或将transient 关键字添加到您的内部类对象声明

【讨论】:

  • 我做到了:公共类 InstamojoPay 实现了 Serializable - 它没有帮助
  • @user1051505 确实有帮助。您没有收到相同的错误消息。您遇到了一个不同的非序列化类。然而,让所有东西都可以序列化并不是正确的答案。
【解决方案2】:

InstaListener 的本地方法实现是instamojo.library.InstamojoPay 的内部类,它不是Serializable。您可能不希望它可序列化,因此解决方案是将您的 InstaListener 实现编写为静态嵌套类,而不是方法本地内部类。

【讨论】:

  • 这解决了它。问题:我无法从静态类中访问 getApplicationContext()。我需要更新回调的 UI 线程。
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 2016-06-09
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多