0

我目前正在为实验性的 KXS-properties 序列化后端苦苦挣扎,主要是因为两个原因:

  1. 我找不到任何文档(我认为没有)
  2. KXS-properties 仅包括一个串行器/解串器,但没有编码器/解码器

框架提供的端点本质上是Map<String, Any>,但映射是平面的,并且键已经具有通常的点分隔属性语法。因此,我必须采取的步骤是将地图编码为可打印到.properties文件的单个字符串,并将文件中的单个字符串解码.properties到地图中。我通常遵循来自https://docs.oracle.com/javase/10/docs/api/java/util/Properties.html#load(java.io.Reader)的属性格式规范,它并不像有人可能会想。

问题是我不能java.util.Properties立即使用,因为 KXS 是多平台的,当我将它限制为 JVM 时,它会有点扼杀它的目的,因为我使用java.util.Properties. 如果我要使用它,解决方案将非常简单,如下所示:https ://gist.github.com/RaphaelTarita/748e02c06574b20c25ab96c87235096d

所以我正在尝试实现我自己的编码器/解码器,遵循kotlinx.serialization.json.Json.kt. 虽然这很乏味,但到目前为止进展顺利,但现在我偶然发现了一个新问题:

据我所知(我不确定,因为没有文档),地图只包含原语(或原语等价物,因为 Kotlin 并没有真正的原语)。KSerializer我怀疑这是因为当您为 KXS 前端编写自己的s 时,您可以通过调用接口的encodeXXX()函数来指定编码为任何原语Encoder。现在的问题是:当我尝试解码到应该包含原语的地图时,我什至怎么知道模型类需要哪些原语?

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

如您所见,我尝试了多种方法,但都没有立即奏效。如果你能帮助我让这些工作中的任何一个工作,那将非常感激

谢谢!

4

1 回答 1

1

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

kotlinx.serialization.Properties 的预期目的是支持将 Kotlin 类序列化到类似 java.util.Properties 的结构或从类似结构的结构中序列化 Kotlin 类。设置相当简单,因为每个嵌套属性都通过将属性名称附加到名称(点属性语法)来序列化。

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

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

于 2020-10-20T09:33:49.567 回答