在活动之间传递对象时发生java.io.NotSerializableException

时间:2018-04-01 19:26:44

标签: java android serialization

我正在尝试将自定义对象从活动传递到另一个。所以我使用了以下代码:

在welcomeActivity.java中:(实现serializable也QuestionRepository.java实现了serializable)

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

在questionActivity.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();
}

正如我从研究中发现的那样,实现序列化足以在活动之间传递对象,但显然我错过了一些东西。我哪里做错了?感谢

3 个答案:

答案 0 :(得分:2)

  

实现serializable足以在活动之间传递对象

是的,但要实现Serializable,Java类在字段中保留的所有内容本身必须是Serializable。在这种情况下,您没有编写Java类 - 它是由Room为您生成的代码。

RoomDatabase BaseRepository应该是单身人士;然后,两个活动都可以访问该单例以使用BaseRepository

通常,通过Intent附加内容传递任意对象是代码气味。 Android必须将这些对象的2个副本作为启动其他组件的一部分(在本例中为启动活动),并且这些副本将在OS进程之间传递。

答案 1 :(得分:2)

com.example.user.repository.BaseRepository_Impl$4a generated class,根据例外情况,Serializable没有实施。{
将DAO从活动传递到另一个活动毫无意义。 Service / Dao实例是依赖关系和无状态。因此,您应该将它们注入需要它们的每个活动/组件中。

答案 2 :(得分:0)

你不能将Serializable用于复杂对象,你需要实现需要大量样板的Parcelable,我会将一个库重新命名为Parceler(https://github.com/johncarl81/parceler)以使其更容易