在没有序列化程序的对象上使用 JSON.stringify 需要标记为实验性

Posted

技术标签:

【中文标题】在没有序列化程序的对象上使用 JSON.stringify 需要标记为实验性【英文标题】:Using JSON.stringify on object without serializer needs to be marked as experimental 【发布时间】:2019-05-07 13:22:44 【问题描述】:

android Studio 中使用 kotlin 插件 1.3.10, 当我尝试将一个简单的类对象字符串化为 JSON 时,它不会编译:

此声明是实验性的,它的使用必须标有“@kotlinx.serialization.ImplicitReflectionSerializer”或“@UseExperimental(kotlinx.serialization.ImplicitReflectionSerializer::class)”

@Serializable data class Data(val a: Int, val b: Int)
val data = Data(1, 2)
val x = JSON.stringify(data)

但是,给序列化器工作:

val x = JSON.stringify(Data.serializer(), data)

我看不到其他人有这个问题,知道问题是什么吗?我已经在 gradle.build 中设置了使用序列化。

我导入:

import kotlinx.serialization.*
import kotlinx.serialization.json.JSON

【问题讨论】:

该错误准确描述了您在使用实验性功能时需要执行的操作。到底是什么问题? 【参考方案1】:

不接受序列化程序 (SerializationStrategy) 的 StringFormat.stringify 的重载仍处于试验阶段。如果您查看它的定义(例如,在 IDE 中按 ctrl+单击它),您会看到它如下所示:

@ImplicitReflectionSerializer
inline fun <reified T : Any> StringFormat.stringify(obj: T): String = stringify(context.getOrDefault(T::class), obj)

ImplicitReflectionSerializer 注释本身是在同一个文件中声明的 (SerialImplicits.kt):

@Experimental
annotation class ImplicitReflectionSerializer

因此,由于它仍处于实验阶段,因此您需要完全按照警告中的说明进行操作,即告诉编译器允许使用实验性功能,方法是在您使用它的地方添加诸如 @UseExperimental... 之类的注释。

请注意,kotlinx.serialization GitHub 存储库的主自述文件中显示的 quick example 表明您需要在调用 stringify 时传入序列化程序。

【讨论】:

啊,好的。所有使用它的例子都没有提到它。但是,当我用 @UseExperimental... 注释使用它的函数时,调用的函数也需要注释,一直到我认为的顶层。有没有办法避免这种情况? 我不确定这是不是真的。我只是在那里尝试过,当我用@UseExperimental 注释Class1.method1() 时,我可以从Class2.method2() 调用它,而无需用@UseExperimental 注释第二类/方法。你得到不同的结果吗? 事实上,documentation 中明确说明了这一点:“如果声明使用 UseExperimental 进行注释,则不需要选择加入该实验性 API。 " 谢谢,正在使用。我正在使用'@kotlinx.serialization.ImplicitReflectionSerializer''@UseExperimental(kotlinx.serialization.ImplicitReflectionSerializer::class)'

以上是关于在没有序列化程序的对象上使用 JSON.stringify 需要标记为实验性的主要内容,如果未能解决你的问题,请参考以下文章

临时变量如何在 Worker 上可用

JSON.parse和JSON.stringify的区别

对象(通用)的 Protobuf-net 序列化抛出错误没有为类型定义序列化程序:System.Object

有没有办法在我自己的应用程序中使用 Visual Studio 的监视窗口?

反序列化具有在 AssemblyResolve 上加载的其他程序集中声明的类型字段的对象时出错

django rest JSONWebTokenAPIView 序列化程序类对象没有属性“对象”