Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解码和编码kotlinx.serialization.properties的字符串_Kotlin_Serialization_Deserialization_Properties File_Kotlinx.serialization - Fatal编程技术网

解码和编码kotlinx.serialization.properties的字符串

解码和编码kotlinx.serialization.properties的字符串,kotlin,serialization,deserialization,properties-file,kotlinx.serialization,Kotlin,Serialization,Deserialization,Properties File,Kotlinx.serialization,我目前正努力使用实验性的KXS属性序列化后端,主要原因有两个: 我找不到它的任何文档(我想没有) KXS属性仅包括序列化器/反序列化器,但不包括编码器/解码器 框架提供的端点本质上是Map,但是Map是平面的,并且键已经具有通常的点分隔属性语法。因此,我必须采取的步骤是将地图编码为单个字符串,该字符串可打印到.properties文件中,并将.properties文件中的单个字符串解码到地图中。我通常遵循的是来自的属性格式规范,这并不像人们想象的那么简单 问题是我不能马上使用java.util.

我目前正努力使用实验性的KXS属性序列化后端,主要原因有两个:

  • 我找不到它的任何文档(我想没有)
  • KXS属性仅包括序列化器/反序列化器,但不包括编码器/解码器
  • 框架提供的端点本质上是
    Map
    ,但是Map是平面的,并且键已经具有通常的点分隔属性语法。因此,我必须采取的步骤是将地图编码为单个字符串,该字符串可打印到
    .properties
    文件中,并将
    .properties
    文件中的单个字符串解码到地图中。我通常遵循的是来自的属性格式规范,这并不像人们想象的那么简单

    问题是我不能马上使用
    java.util.Properties
    ,因为KXS是多平台的,如果我将其限制在JVM中,因为我使用
    java.util.Properties
    ,它会有点扼杀它的用途。如果我使用它,解决方案将非常简单,如下所示:

    因此,我尝试实现自己的编码器/解码器,遵循
    kotlinx.serialization.json.json.kt
    的粗略结构。虽然这相当乏味,但到目前为止进展顺利,但现在我偶然发现了一个新问题:

    据我所知(我不确定,因为没有文档),映射只包含原语(或原语等价物,因为Kotlin实际上没有原语)。我怀疑这是因为当您为KXS前端编写自己的
    KSerializer
    s时,您可以通过调用
    encodeXXX()
    编码器接口的
    functions指定对任何原语进行编码。现在的问题是:当我试图解码到应该包含原语的映射时,我怎么知道模型类需要哪些原语

    我曾经用Java编写过自己的序列化器/反序列化器来了解这个主题,但在那个实现中,后端与前端的耦合要紧密得多,因此我可以从后端的模型类中查询预期的基元类型。但在我的情况下,我没有访问模型类的权限,也不知道如何检索期望的类型

    正如你所看到的,我尝试了多种方法,但没有一种能马上奏效。如果你能帮我让这些工作,那将是非常感谢


    谢谢大家!

    它在kotlinx.serialization中的工作方式是,存在描述类和结构等的序列化程序以及写/读属性以及结构的代码。然后,格式的任务是将这些操作映射到数据格式或从数据格式映射到数据格式

    kotlinx.serialization.Properties的预期用途是支持将Kotlin类序列化到类似于java.util.Properties的结构中。在设置中非常简单,每个嵌套属性都是通过将属性名称前置到名称(虚线属性语法)来序列化的

    不幸的是,这种格式的反序列化确实需要知道预期的类型。它不仅仅从字符串中读取。但是,可以确定结构。您可以使用序列化程序的
    描述符
    属性来反省期望值


    从我的角度来看,这种格式比它应该的要简单一些。这是一个很好的自定义格式示例。格式之间的一个关键区别是,它们是否仅用于提供存储格式,或者输出是否用于(能够)表示设计良好的api。后者需要更加复杂。

    这里是kotlinx.serialization的文档:请参阅本节。我相信这将是一个更好的选择序列化地图比使用属性好,没有这些东西告诉我什么我还不知道。关于属性序列化程序的“文档”并不是我在kotlinx序列化属性的代码注释中所能找到的。您所说的“本机支持属性格式”是什么意思?我找不到关于它的任何东西,很抱歉,它实际上没有,删除了那个注释是的,我现在也找到了描述符部分。我目前正致力于把整个事情整合起来。我认为把它作为一个包部署在某个地方,因为这是一个绝对不平凡的任务(正如我必须找出的)。非常感谢。