Android DialogFragment Bundle putSerializable:有时给出NotSerializableException

Android DialogFragment Bundle putSerializable:有时给出NotSerializableException,android,android-fragments,bundle,serializable,android-bundle,Android,Android Fragments,Bundle,Serializable,Android Bundle,我有一个物体,里面有其他物体。我需要将该对象传递给一个片段对话框,因此我使该对象可序列化,并且它在我的设备中工作得非常好 public static SelectTeamDialog newInstance(Data data) { SelectTeamDialog dialog = new SelectTeamDialog(); Bundle args = new Bundle(); args.putSerializable(ARG_PARAM1, data);

我有一个物体,里面有其他物体。我需要将该对象传递给一个片段对话框,因此我使该对象可序列化,并且它在我的设备中工作得非常好

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


数据对象非常大,里面有很多对象,里面有很多对象,这一点很重要。并不是所有这些对象都是可序列化的,但我注意到,当您将捆绑包传递给片段或DialogFragment时,并不需要序列化对象中包含的所有子对象都可序列化,以便在捆绑包中传递具有putSerializable的父对象


我知道它,因为它在我的设备和95%的设备中工作。但是,如果我试图将这个内部包含不可序列化对象的可序列化对象传递给一个具有捆绑包的活动,则需要使所有子对象也可序列化(我不能这样做,因为这样在序列化时它会发出outofmemory)。为什么在将其传递给片段时不需要它,但在处理活动时却需要它


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

如果
Serializable
真的被序列化,然后,当序列化遇到它无法处理的问题时,您将使用
NotSerializableException
崩溃

使用
Intent
extra,当您使用
Intent
启动活动、启动服务或发送系统广播时,所有extra都将被序列化。执行这些操作都涉及进程间通信(IPC),即使生成的活动/服务/接收者恰好在您的应用程序中。因此,当您将部分可序列化的对象作为Intent额外对象传递时,您将很快遇到一个
notserializableeexception
崩溃


片段参数不一定是序列化的。如果调用了
onSaveInstanceState()
,这些参数将自动成为保存的实例状态的一部分。片段可能不会经常使用
onSaveInstanceState()
调用,因此作为参数的部分可序列化的
对象可能会继续存在。然而,不可避免地,有人会按HOME键或切换到另一个应用程序,并且会调用
onSaveInstanceState()
。然后,您的partially-
Serializable
对象参数将为您提供一个
notserializableeexception

“我注意到,当您将捆绑包传递给片段或DialogFragment时,没有必要让可序列化对象中包含的所有子对象都可序列化以传递捆绑包中具有putSerializable的父对象”--是的,这是必要的。“我知道这一点,因为它在我的设备和95%的设备中工作。”“--当这些参数被放入已保存的实例状态
Bundle
并跨流程边界传递时,情况就不一样了。“为什么在将其传递到片段时不需要它,但在处理活动时却需要它?”--因为
Intent
附加总是跨流程边界传递。片段参数可以是也可以不是(例如,取决于是否调用
onSaveInstanceState()
)。也许您应该从参数切换到其他机制,例如
ViewModel
,以跨配置更改保留数据。嗯,@commonware,如果我将所有类都设置为可序列化的,那么少数NotSerializableException将消失?@commonware为什么它在saveInstanceState()上如果我的应用程序不允许更改配置,是否调用?。我想你的意思是,当“跨越流程边界传递”时调用它“如果我将所有类都设置为可序列化,那么,少数NotSerializableException将消失?”——这将取决于是否可能。例如,
视图
不可序列化,无论您在其上添加了什么注释。“如果我的应用程序不允许更改配置,为什么会调用nsaveinstate()?--用户可以按HOME按钮。