Realm用findFirst()取数据放Bundle跳转页面报序列化IO异常如何解决?
异常引发原因
- Realm通过
findFirst()返回的实例是动态生成的RealmProxy代理类对象,并非你定义的原始实体类实例。该代理类未实现Serializable接口,强制转型后执行序列化操作就会触发IO异常。 - Realm代理对象默认绑定当前线程的Realm会话,内部持有数据库连接引用,设计上本身就不支持跨组件、跨线程的序列化传输。
修复方案
- 方案1:获取脱管对象后序列化
调用copyFromRealm()方法将代理对象转为脱离Realm管控的普通实体类实例,只要你的自定义实体类实现了Serializable接口,就可以正常存入Bundle:// 先查询再拷贝得到脱管对象 StationAndLocationModel item = realm.copyFromRealm(realm.where(StationAndLocationModel.class).findFirst()); // 再存入Bundle mBundle.putSerializable("data", item); - 方案2:改用Parcelable实现序列化
给自定义Realm实体类实现Parcelable接口,Android原生Bundle传输优先推荐Parcelable,性能比Serializable高3~10倍,同样需要先通过copyFromRealm()拿到脱管对象后再存入Bundle。 - 方案3:仅传递主键重新查询
如果对象字段较多、数据量大,可以只把该数据的唯一主键存入Bundle,跳转至目标Activity后再用主键重新查询Realm获取对应实例,不需要做序列化操作,更符合Realm的设计使用规范。
内容的提问来源于stack exchange,提问作者DGAD
相关产品推荐
相关产品推荐

