- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
实际上,主要问题仍然是 Kotlin 中的类没有具体化的类型参数。但这就是为什么在这种特定情况下这困扰我的原因:
假设您有一个包装类 Wrapper
接受一个字符串 content
和一个类(class)* type
并且可以输出类 type
的对象通过解析检索content
通过调用函数 getObj()
按需作为 JSON :
class Wrapper<T>(private val content: String, /*private val type: KClass<*>*/) {
fun getObj(): T {
// ?
}
}
我想使用 kotlinx.serialization。现在,您可能已经注意到我之前是如何在“class”之后加上星号的。原因如下:是的,
Wrapper
必须以某种方式接受目标类(class),但如何?它应该只是 typearg(因为类型erausre 不起作用)还是
KClass
引用(不起作用,因为我需要一个具体化的 typearg)?
Json.decodeFromString<T>(content)
,其中
T
是目标类型和
content
是 JSON 字符串。现在,
T
被定义为具体化(以便可以在运行时处理该类型)并且只能填充另一个具体化的 typearg 或实际的类引用。我不能使用另一个具体化的 typearg,因为我在一个类的上下文中,而一个类不能有具体化的 typeargs。我也不能使用实际的类引用,因为类的用户应该能够用不同的目标来构造它,例如他们决定目标是什么,而不是我。
最佳答案
好的,所以还没有人回答这个问题,但我也在 r/Kotlin subreddit 中发布了这个问题。 Here it is .
我实际上在那里得到了一个答案(归功于 u/JakeWharton),并且由于您可能会遇到这个 StackOverflow 问题,因为您在谷歌上搜索了相同的问题,因此您可能很高兴在这里找到答案。所以这是我试图解释答案的尝试:
因此,基本上,kotlinx 序列化确实不适用于 KClass
es.但仔细想想,你只需要KClass
以确定如何序列化它。由于这是在您使用 KXS 时在编译时确定的,因此您实际上只需要传递序列化程序(定义如何序列化/反序列化您的类的实际策略)。您可以获得每个用 @Serializable
注释的类的序列化程序。通过调用 .serializer()
在上面;结果将是类型 KSerializer<T>
.所以,而不是拥有
class Wrapper<T>(private val content: String, private val type: KClass<T>)
并通过构建它
val wrapper = Wrapper("{}", Foo::class)
你可以这样做:
class Wrapper<T>(private val content: String, private val serializer: KSerializer<T>)
然后像这样构造它:
val wrapper = Wrapper("{}", Foo.serializer())
(假设
Foo
用
@Serializable
注释)
KSerializer
序列化和反序列化而不是 typearg,像这样:
val obj: T = Json.decodeFromString(serializer, "[Your JSON String]")
val str: String = Json.encodeToString(serializer, obj)
就是这样!只需换掉您的常规
(K)Class
方法来自
KSerializer
它将与 KXS 一起使用。
关于json - Kotlinx 序列化 : How to circumvent reified typeargs for deserialization?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64155561/
我已经尝试了几个小时让 dokka 在 gradle 下工作,但我找不到任何能够解决依赖关系的版本组合。例如 ekolotyluk@MacBook-Pro microservices % ./grad
我正在使用 Android Studio Canary 构建一个新项目,并在为 Jet pack Compose 设置依赖项时将其作为构建输出: Execution failed for task '
我在应用程序中使用外部 API,而反序列化是使用 Kotlinx 序列化包完成的,当 api 结果是多个值的 Int 数组和单个值的原始 int 时,我遇到了问题。我怎样才能避免在此过程中崩溃。有没有
假设我正在上课: @Serializable data class MyClass( @SerialName("a") val a: String?, @SerialName("b")
我在应用程序中使用外部 API,而反序列化是使用 Kotlinx 序列化包完成的,当 api 结果是多个值的 Int 数组和单个值的原始 int 时,我遇到了问题。我怎样才能避免在此过程中崩溃。有没有
我正在尝试使用 kotlinx @Serializable,我遇到了这个问题: 我有以下类(class): @Serializable sealed class GrandParent 第二个: @S
我有一个 Json 输入,例如: { "type": "type_1", "data": { // ... } } data字段可能因 type 而异. 所以,我需要一个
这是我的 pojo 课 @Serializable data class Response( @SerialName("message") val message: String?,
如何使用 kotlinx 序列化来对可选字符串列表进行字符串化?我想执行类似的操作: val json = Json(JsonConfiguration.Stable) val data: List
字符串化时有没有办法忽略空值?当前它呈现为: “字段”:空 如果有一种方法可以根本不渲染空字段,那将是很好的-但我没有找到这样的选择。有人知道这怎么工作吗? 最佳答案 目前尚无法解决,但您可能需要跟踪
我正在为许多第三方 API 生成 JSON。他们中的许多人接受不同对象的列表(JSON 数组),但是,他们都不会接受 "type": "com.mycom.someclass"由于列表的多态性,由 k
我遇到了这样的错误 Unresolved reference: kotlinx 导入语句就像 kotlinx.android.synthetic.main.activity_main.* 粗体代码变为
尝试Kotlin,在项目中配置Kotlin,添加kotlin-android-extensions,还添加依赖项... import kotlinx.android.**synthetic**.mai
迁移到 AndroidX 后,我发现在一些中,并非所有类的 kotlinx.android.synthetic 字段现在都无法转换为实际类。 Widget has an unresolved type
我想制作一个自定义列表序列化程序,它将安全地解析无效的 json 数组。示例:Int 列表 [1, "invalid_int", 2] 应解析为 [1, 2]。我已经制作了一个序列化器并将其添加到 J
如果我没有指定任何内容,协程默认范围如何工作。让我们看一下这个例子: class MyAppCompatActivity:AppCompatActivity{ fun getContact() {
我正在使用 Java 8 的 LocalDatetime 转换一些代码使用 kotlinx-datetime 中的版本而且我找不到任何格式化方法。具体来说,我正在替换 FormatStyle.MEDI
我有一个为网络流量序列化的类。 @Serializable data class Packet(val dataType: String, val payload: Any) 我已经使用 Jav
安卓工作室 3.6 在一个屏幕上,我通过协程进行轮询,如下所示: fun initPoll() = viewModelScope.launch(Dispatchers.M
我注意到代码库中有以下函数,它使用 kotlinx html ,而且很难完全理解: private fun Tag.xrefImpl(prop: KMutableProperty0) = t
我是一名优秀的程序员,十分优秀!