DialogFragment Bundle putSerializable:有时会出现 NotSerializableException

DialogFragment Bundle putSerializable: Sometimes giving NotSerializableException

我有一个物体,里面有其他物体。我需要将该对象传递给 FragmentDialog,因此我将该对象设置为可序列化,并且它在我的设备中运行良好。

public static SelectTeamDialog newInstance(Data data) {
    SelectTeamDialog dialog = new SelectTeamDialog();
    Bundle args = new Bundle();
    args.putSerializable(ARG_PARAM1, data);
    dialog.setArguments(args);
    return dialog;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        data = (Data) getArguments().getSerializable(ARG_PARAM1);
    }
}

问题是我在 google 开发者控制台中看到了一些 NotSerializableException 的报告,因此出于某种原因,在某些设备中,出现了 NotSerializableException.

重要的是,Data对象很大,里面有很多对象,里面有很多对象。并非所有这些对象都是可序列化的,但我注意到,当您将包传递给 Fragment 或 DialogFragment 时,可序列化对象中包含的所有子对象都是可序列化的,以便通过包中的 putSerializable 传递该父对象。

我知道它是因为它在我的设备和 95% 的设备上都能正常工作。但是,如果我尝试将这个带有不可序列化对象的可序列化对象传递给带有捆绑包的 Activity ,它也需要使所有子对象都可序列化(我不能这样做,因为它在序列化时会出现内存不足) .为什么在将它传递给 Fragment 时没有必要,但在使用 Activity 时却有必要?

如果它对我和 95% 的使用此应用程序的设备都有效,为什么它会在开发者控制台中报告一些异常?

如果 Serializable 真的被序列化,那么当序列化遇到它无法处理的东西时,你会崩溃并出现 NotSerializableException

对于 Intent extra,当您使用 Intent 启动 activity、启动服务或发送系统广播时,所有 extra 都将被序列化。做任何这些事情都涉及进程间通信 (IPC),即使结果 activity/service/receiver 恰好在您的应用程序中。因此,当您将部分 Serializable 对象作为 Intent 额外传递时,您将很快崩溃 NotSerializableException

片段参数不一定序列化。如果 onSaveInstanceState() 被调用,它们将是,因为参数自动成为您保存的实例状态的一部分。片段可能不会经常用 onSaveInstanceState() 调用,因此部分 Serializable 对象作为参数可能会保留下来。然而,不可避免地,有人会按 HOME 或以其他方式切换到另一个应用程序,并且 onSaveInstanceState() 将被调用。然后,您的部分 Serializable 对象参数将为您提供 NotSerializableException.