Сериализуемый интерфейс с несериализуемыми объектами - PullRequest
0 голосов
/ 16 июня 2019

У меня есть внутренний интерфейс, реализующий Serializable. Я вижу сбои, сообщающие, что мой объект не сериализуем, но я не уверен, что это потому, что интерфейс объявлен в классе или из-за чего-то еще.

Я знаю, что классы с несериализуемыми объектами, такими как Activity, не могут быть сериализованы, но как насчет интерфейсов с методами, возвращающими объекты Activity, например?

Проще говоря, у меня есть

public class MyClass extends Parcelable{

    MyInterface mInterface;

    public interface MyInterface implements Serializable{
     Activity getActivity();
    }
}

и я получаю журналы аварий при попытке написать Посылку

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)

Какова наиболее вероятная причина не сериализации:

  • этот интерфейс находится внутри класса, который не сериализуем
  • этот интерфейс включает в себя действие

1 Ответ

0 голосов
/ 16 июня 2019

Какова наиболее вероятная причина не сериализации

Что касается ваших вариантов:

  • Вложенный интерфейс по сути статичен по объему, поэтому с Serializable не должно быть проблем с ним

  • Я предполагаю, что под «этот интерфейс входит действие», вы подразумеваете, что у интерфейса есть метод, который возвращает «действие», которое не имеет прямого отношения, поскольку ни интерфейсы, ни методы не сериализуются

Объекты и их поля сериализуются. Таким образом, тот факт, что MyInterface имеет метод, который возвращает Activity, не является строго проблемой, поскольку может случиться так, что конкретный сериализуемый объект вернет null для этого метода.

Однако, если у объекта есть поле, которое содержит Activity (прямо или косвенно) & mdash; и ваш метод использует это поле в качестве возвращаемого значения & mdash; тогда у вас проблемы, потому что Activity и множество вещей, за которые держится Activity, не может быть сериализовано.

И, исходя из вашей трассировки стека, я предполагаю, что ваш объект удерживает Activity.

При разработке приложений для Android использование Serializable является запахом кода. В этом нет ничего страшного. Но в подавляющем большинстве случаев я вижу, что люди в Stack Overflow пытаются использовать его, потому что они пытаются решить неправильную проблему (например, передать слушателя между действиями) с неправильным решением (т. Е. Использовать Serializable на интерфейс слушателя).

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