具有不可序列化对象的可序列化接口

时间:2019-06-15 21:46:01

标签: android serialization interface

我有一个实现Serializable的内部接口。 我看到崩溃提示我的对象不可序列化,但是我不确定是否是因为接口是在类中声明的,还是因为其他原因。

我知道带有不可序列化对象(例如Activity)的类无法序列化,但是例如,与返回Activity对象的方法的接口呢?

更清楚地说,我有

public class MyClass extends Parcelable{

    MyInterface mInterface;

    public interface MyInterface implements Serializable{
     Activity getActivity();
    }
}

当我尝试编写包裹时,我得到了崩溃日志

dest.writeSerializable(mInterface);

堆栈跟踪读取:

Caused by java.io.NotSerializableException: com.android.internal.view.menu.MenuBuilder
   at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1233)
   at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1597)
   at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1558)
   at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1481)
   at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1227)
   at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1597)
   at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1558)
   at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1481)
   at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1227)
   at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1597)
   at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1558)
   at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1481)
   at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1227)
   at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
   at android.os.Parcel.writeSerializable(Parcel.java:1757)
   at MyClass.writeToParcel(MyClass.java:87)

不被序列化的最可能原因是什么

  • 该接口位于无法序列化的类中
  • 该界面包含一项活动

1 个答案:

答案 0 :(得分:0)

  

不被序列化的最可能原因是什么

关于您的选择:

  • 嵌套接口在范围上本质上是静态的,因此Serializable对此应该没有问题

  • 我假设“接口包含一个活动”是指“该接口具有一个返回“活动”的方法,该方法并不直接相关,因为接口和方法均未序列化

对象及其字段被序列化。因此,MyInterface的方法可以返回Activity的事实严格来说并不是问题,因为可能序列化的特定对象将为该方法返回null

但是,如果对象的字段(直接或间接)包含Activity(而您的方法恰巧使用该字段作为其返回值),那么您就麻烦了,因为Activity并且Activity保留的许多内容无法序列化。

而且,根据您的堆栈跟踪,我猜测是您的对象正在握住Activity

在Android应用开发中,使用Serializable是一种代码味道。完全没有错。但是在大多数情况下,我看到Stack Overflow上的人们试图使用它,这是因为他们正在尝试使用错误的解决方案(例如,使用Serializable解决错误的问题(例如,在活动之间传递侦听器)在侦听器界面上。