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



我有一个实现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)

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

  • 该接口位于不可序列化的类内
  • 该接口包含一个活动

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

关于您的选择:

  • 嵌套接口在作用域本质上是静态的,因此Serializable应该没有问题

  • 我假设"该接口
  • 包含一个活动"是指"该接口具有返回'活动'的方法,该方法不直接相关,因为接口和方法都没有序列化

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

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

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

在 Android 应用开发中,使用Serializable是一种代码异味。这并没有什么严格的问题。但是绝大多数时候我看到Stack Overflow上的人试图使用它,这是因为他们试图用错误的解决方案(即在监听器接口上使用Serializable)解决错误的问题(例如,在活动之间传递侦听器)。