我有一个实现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
)解决错误的问题(例如,在活动之间传递侦听器)。