Kotlin:ObjectBox 的合并实体 class 和 kotlinx.Serialization 有冲突吗?

Kotlin: combined Entity class of ObjectBox and kotlinx.Serialization in conflict?

我正在使用 kotlinx.serialization to parse JSON from an API and ObjectBox 作为本地存储。

两个库都允许构建模型或实体 classes。我想避免冗余的 classes 并且更愿意将它们组合成一个实体 class 每个。

它工作正常,直到我不得不添加 relations

我愿意接受 API 中的所有内容,这就是为什么每个字段都是 @Optional 的原因。验证是在实体的 ObjectBox 部分进行的。

您可以在下面找到所需的代码,但该代码不起作用。

第一个问题: @Optional 字段需要有默认值。添加 ? = null (感觉很脏)后,我得到了

第二个问题:解析存储后出现如下错误:

java.lang.NoSuchMethodError: No direct method (Lkotlin/reflect/KClass;Lkotlinx/serialization/KSerializer;)V in class Lkotlinx/serialization/ContextSerializer; or its super classes (declaration of 'kotlinx.serialization.ContextSerializer' appears in /data/app/com.acme.myapp2A1fXerVu==/split_lib_dependencies_apk.apk)

实体:AppleTree

@Entity // ObjectBox
@Serializable // Serializable
data class AppleTree(

    @Optional // Serializable
    @Id(assignable=true) // ObjectBox
    var id: Long = 0,

    @Optional // Serializable
    @Backlink // ObjectBox    
    var apples: ToMany<Apple>
)

实体:Apple

@Entity 
@Serializable 
data class Apple(

    @Optional // Serializable
    @Id(assignable=true) // ObjectBox
    var id: Long = 0,

    @Optional // Serializable
    var tree: ToOne<AppleTree>     
)

获取并存储

private fun fetch() {
  doAsync {
      var json = mapKeys(URL(myURL).readText()) // fetch JSON from API
      uiThread {
          val appleTree = JSON.nonstrict.parse<AppleTree>(json) // parse JSON
          val appleTreeBox = (application as App).getAppleTreeBox() // get ObjectBox
          appleTreeBox.put(appleTree) // save
      }
  }
}

有什么想法吗?

提前致谢!

我找不到没有冲突的组合解决方案,所以我决定拆分模型:

  1. 每个 API 调用改造 2
  2. 每个 ObjectBox 实体的模型

我在从 Retrofit 获取数据后创建了 ObjectBox 实体。有点太多冗余,但它的工作原理。 :-)

我刚刚看到这个解决方案并写了一篇关于如何在不映射实体的情况下简单地做到这一点的文章。

希望对您有所帮助 -> https://medium.com/@ryan.shaw_80293/android-local-database-tricks-with-kotlin-and-objectbox-f0da58c9d5a3