在没有序列化程序的对象上使用 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 需要标记为实验性的主要内容,如果未能解决你的问题,请参考以下文章
对象(通用)的 Protobuf-net 序列化抛出错误没有为类型定义序列化程序:System.Object
有没有办法在我自己的应用程序中使用 Visual Studio 的监视窗口?