我有一个实现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)
不被序列化的最可能原因是什么
?
答案 0 :(得分:0)
不被序列化的最可能原因是什么
关于您的选择:
嵌套接口在范围上本质上是静态的,因此Serializable
对此应该没有问题
我假设“接口包含一个活动”是指“该接口具有一个返回“活动”的方法,该方法并不直接相关,因为接口和方法均未序列化
对象及其字段被序列化。因此,MyInterface
的方法可以返回Activity
的事实严格来说并不是问题,因为可能序列化的特定对象将为该方法返回null
。
但是,如果对象的字段(直接或间接)包含Activity
(而您的方法恰巧使用该字段作为其返回值),那么您就麻烦了,因为Activity
并且Activity
保留的许多内容无法序列化。
而且,根据您的堆栈跟踪,我猜测是您的对象正在握住Activity
。
在Android应用开发中,使用Serializable
是一种代码味道。完全没有错。但是在大多数情况下,我看到Stack Overflow上的人们试图使用它,这是因为他们正在尝试使用错误的解决方案(例如,使用Serializable
解决错误的问题(例如,在活动之间传递侦听器)在侦听器界面上。