Java.io.NotSerializableException при передаче объекта между активностями

Я пытаюсь передать свой настраиваемый объект из одного действия другому. Поэтому я использовал следующий код:

В welcomeActivity.java: (реализует сериализуемый, также QuestionRepository.java реализует сериализуемый)

Intent intent = new Intent(WelcomeActivity.this,QuestionActivity.class);
intent.putExtra("category", 1);
intent.putExtra("qustionRepository", questionRepository);
startActivity(intent);

Под вопросомActivity.java:

questionRepository = (QuestionRepository) getIntent().getSerializableExtra("questionRepository");

Во время выполнения я получил эту ошибку:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.user.loginactivity, PID: 16608
              java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.user.repository.QuestionRepository)
                  at android.os.Parcel.writeSerializable(Parcel.java:1316)
                  at android.os.Parcel.writeValue(Parcel.java:1264)
                  at 
     ...
               Caused by: java.io.NotSerializableException: com.example.user.repository.BaseRepository_Impl$4
                  at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
                  at 
     ... 

BaseRepository - это интерфейс, расширяющий сериализуемые.

@Dao
public interface BaseRepository extends Serializable {

@Query("SELECT * FROM User")
List<User> getAllUserScores();

@Query("SELECT * FROM user where first_name LIKE  :firstName AND last_name LIKE :lastName")
User findUserByName(String firstName, String lastName);

@Insert
void insertUser(User user);

@Delete
void deleteUser(User user);

@Insert
void insertQuestion(Question question);

@Delete
void deleteQuestion(Question question);

@Query("Select * from Question")
List<Question> getAllQuestions();
}

Как я понял из своих исследований, реализации сериализуемого достаточно для передачи объектов между активностями, но, видимо, я что-то упустил. Где я делаю не так? Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
183
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

implementing serializable is enough to pass objects between activites

Да, но для реализации Serializable все, что класс Java удерживает в полях, должно быть Serializable. В этом случае вы не писали класс Java - он создается для вас с помощью Room.

Ваш RoomDatabase с BaseRepository должен быть синглтоном; оба действия могут получить доступ к этому синглтону для работы с BaseRepository.

В общем, передача произвольных объектов через дополнительные функции Intent - это запах кода. Android должен сделать 2+ копии этих объектов как часть запуска другого компонента (в данном случае, запуска действия), и эти копии передаются между процессами ОС.

Теперь я получил предысторию ошибки, большое спасибо.

JollyRoger 01.04.2018 21:57

com.example.user.repository.BaseRepository_Impl$4 - это сгенерированный класс, который, согласно исключению, не реализует Serializable.
. Передача DAO из одного действия в другое не имеет смысла. Экземпляры Service / Dao являются зависимостями и не имеют состояния. Поэтому вместо этого вы должны вводить их в каждое действие / компонент, где они необходимы.

Как я могу добавить их в свой класс QuestionActivity?

JollyRoger 01.04.2018 21:57

Кинжал 2 например.

davidxxx 01.04.2018 21:58
Ответ принят как подходящий

Вы не можете использовать Serializable для сложного объекта, вам нужно реализовать Parcelable, который требует большого количества шаблонов, я бы рекомендовал библиотеку как Parceler (https://github.com/johncarl81/parceler), чтобы упростить

Теперь я могу перейти к активности QuestionActivity, но мой questionRepository возвращает null после этого: "questionRepository = getIntent (). GetParcelableExtra (" questionRepository ");" в вопросе активности. Это почему?

JollyRoger 01.04.2018 21:56

Другие вопросы по теме