DialogFragment Bundle putSerializable: иногда дает исключение NotSerializableException - PullRequest
1 голос
/ 02 февраля 2020

У меня есть объект, внутри которого есть другие объекты. Мне нужно передать этот объект в FragmentDialog, поэтому я сделал этот объект Serializable, и он отлично работает на моем устройстве.

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);
    }
}

Проблема в том, что я вижу некоторые NotSerializableException в консоли разработчика Google поэтому, по некоторым причинам, в некоторых устройствах выдает NotSerializableException.

Важно сказать, что объект Data очень большой, и внутри него много объектов, а внутри много объектов. И не все эти объекты являются сериализуемыми, но я заметил, что при передаче пакета в Fragment или DialogFragment необязательно, чтобы все подчиненные объекты, содержащиеся в сериализуемых объектах, были сериализуемыми для передачи этого родительского объекта с помощью putSerializable в пакете.

Я знаю это, потому что он работает на моем устройстве и на 95% устройств. Но если я пытаюсь передать этот сериализуемый объект с не сериализуемыми объектами внутри в Activity с пакетом, он требует также сделать все подчиненные объекты сериализуемыми (я не могу этого сделать, потому что тогда он выдает воспоминания при сериализации). Почему нет необходимости при передаче его фрагменту, но это необходимо при работе с деятельностью?

И почему это дает мне некоторые исключения, о которых сообщается в консоли разработчика, если она работает для меня и для 95% устройств которые используют это приложение?

1 Ответ

1 голос
/ 02 февраля 2020

Если Serializable действительно сериализован, то вы взломаете sh с NotSerializableException, когда сериализация встретит что-то, с чем она не может справиться.

С дополнительным Intent, когда вы используете Intent, чтобы начать действие, запустить службу или отправить системную трансляцию, все дополнения будут сериализованы. Выполнение любого из этих действий подразумевает межпроцессное взаимодействие (IP C), даже если полученное действие / услуга / получатель окажется в вашем приложении. Поэтому, когда вы передаете частично- Serializable объект как Intent extra, вы быстро обработаете sh с NotSerializableException.

Аргументы фрагмента не обязательно сериализуются. Они будут, если вызван onSaveInstanceState(), поскольку аргументы автоматически становятся частью вашего сохраненного состояния экземпляра. Возможно, что фрагмент не будет вызываться с onSaveInstanceState() очень часто, и поэтому частично- Serializable объект в качестве аргумента может выжить. Однако, неизбежно, кто-то нажмет ДОМОЙ или иным образом переключится на другое приложение, и будет вызван onSaveInstanceState(). Тогда ваш частично- Serializable аргумент объекта даст вам NotSerializableException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...