首页 > 解决方案 > 具有不可序列化对象的可序列化接口

问题描述

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

没有被序列化的最可能原因是什么:

?

标签: androidserializationinterface

解决方案


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

关于您的选择:

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

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

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

但是,如果对象有一个包含Activity(直接或间接)的字段——并且你的方法恰好使用该字段作为它的返回值——那么你就有麻烦了,因为Activity很多东西Activity不能被序列化。

而且,根据您的堆栈跟踪,我的猜测是您的对象持有一个Activity.

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


推荐阅读