You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:45:28