Realm Kotlin调用gson.toJson()出现StackOverflowError问题求助
解决Realm Kotlin与Gson序列化导致的StackOverflowError问题
问题根源
直接用Gson序列化Realm返回的RealmResults<Book>或RealmObject子类对象时会触发栈溢出。因为Realm对象是动态代理实现,内部包含大量代理相关的隐藏属性,Gson通过反射序列化时会递归访问这些属性,最终导致StackOverflowError。
解决方案
以下是两种简单有效的解决方式:
方式1:转换为普通数据类(DTO)序列化
先定义与Realm实体对应的普通数据类,将Realm对象映射为该数据类后再序列化:
// 定义普通数据类 data class BookDto(val id: String, val name: String) // 在MainActivity中修改序列化逻辑 val list = realm.query<Book>().find() // 将Realm对象转换为DTO列表 val bookDtos = list.map { BookDto(it.id, it.name) } // 序列化DTO列表 Log.i("AOEU", Gson().toJson(bookDtos))
方式2:将Realm结果转为普通List
利用Realm提供的方法,把RealmResults复制为非代理的普通对象列表,再序列化:
val list = realm.query<Book>().find() // 复制为普通List(脱离Realm代理) val normalBookList = realm.copyFromRealm(list) // 序列化普通列表 Log.i("AOEU", Gson().toJson(normalBookList))
注意事项
- 禁止直接序列化Realm的代理对象(包括
RealmResults和单个RealmObject实例) - 使用方式2时,
copyFromRealm会创建对象的深拷贝,脱离Realm的生命周期管理,适合临时序列化场景
内容的提问来源于stack exchange,提问作者zihadrizkyef
相关产品推荐
相关产品推荐

