我正在使用kotlinx.serialization从 API 和ObjectBox解析 JSON作为本地存储。
这两个库都允许构建模型或实体类。我想避免多余的类,而是更喜欢将它们组合成一个实体类。
在我不得不添加关系之前它工作得很好。
我想接受来自 API 的所有内容,这就是为什么每个字段都是@Optional
. 验证是在ObjectBox
实体方面进行的。
您可以在下面找到所需的代码,但该代码不起作用。
第一个问题: @Optional
字段需要有一个默认值。添加后? = null
(感觉很脏),我到了
问题二:解析存储后出现如下错误:
java.lang.NoSuchMethodError: No direct method (Lkotlin/reflect/KClass;Lkotlinx/serialization/KSerializer;)V in class Lkotlinx/serialization/ContextSerializer; 或其超类('kotlinx.serialization.ContextSerializer' 的声明出现在 /data/app/com.acme.myapp2A1fXerVu==/split_lib_dependencies_apk.apk 中)
实体:苹果树
@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>
)
实体:苹果
@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
}
}
}
任何想法?
先感谢您!