android - 具有不可序列化对象的可序列化接口
问题描述
我有一个实现 Serializable 的内部接口。我看到崩溃说我的对象不可序列化,但我不确定是因为接口是在类中声明的,还是因为其他原因。
我知道像 Activity 这样的具有不可序列化对象的类不能被序列化,但是例如带有返回 Activity 对象的方法的接口呢?
为了更清楚,我有
public class MyClass extends Parcelable{
MyInterface mInterface;
public interface MyInterface implements Serializable{
Activity getActivity();
}
}
我在尝试编写 Parcel 时收到崩溃日志
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
在侦听器接口上使用)解决错误的问题(例如,在活动之间传递侦听器) .