kotlinx.serialization.properties 的解码和编码字符串
Decoding and encoding strings for kotlinx.serialization.properties
我目前正在努力使用实验性 KXS-properties 序列化后端,主要有两个原因:
- 我找不到它的任何文档(我认为有 none)
- 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 并没有真正的原语)。我怀疑这是因为当您为 KXS 前端编写自己的 KSerializer
s 时,您可以通过调用 Encoder
接口的 encodeXXX()
函数指定编码为任何原语。现在的问题是:当我尝试解码到应该包含图元的地图时,我怎么知道模型需要哪些图元 class?
我曾在 Java 中编写自己的序列化器/反序列化器来了解该主题,但在该实现中,后端与前端耦合得更紧密,因此我可以查询来自后端模型 class 的预期原始类型。但在我的情况下,我无权访问模型 class 并且我不知道如何检索预期的类型。
如您所见,我尝试了多种方法,但其中 none 立即奏效。如果您能帮助我使其中的 任何 工作,将不胜感激
谢谢!
它在 kotlinx.serialization 中的工作方式是有描述 classes 和结构等的序列化程序,以及 writes/read 属性和结构的代码。然后格式的工作就是将这些操作映射 to/from 一种数据格式。
kotlinx.serialization.Properties 的预期目的是支持序列化 Kotlin class to/from 类似 java.util.Properties 的结构。它的设置相当简单,因为每个嵌套的 属性 都是通过在名称前加上 属性 名称(点属性语法)来序列化的。
不幸的是,从这种格式反序列化确实需要知道预期的类型。它不只是从字符串中读取。但是,可以确定结构。您可以使用序列化程序的 descriptor
属性 来反省期望。
从我的角度来看,这种格式比它应该的要简单一些。这是自定义格式的一个很好的例子。格式之间的一个关键区别是它们是否旨在仅提供一种存储格式,或者输出是否旨在(能够)表示设计良好的 api。后者需要更复杂。
我目前正在努力使用实验性 KXS-properties 序列化后端,主要有两个原因:
- 我找不到它的任何文档(我认为有 none)
- 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 并没有真正的原语)。我怀疑这是因为当您为 KXS 前端编写自己的 KSerializer
s 时,您可以通过调用 Encoder
接口的 encodeXXX()
函数指定编码为任何原语。现在的问题是:当我尝试解码到应该包含图元的地图时,我怎么知道模型需要哪些图元 class?
我曾在 Java 中编写自己的序列化器/反序列化器来了解该主题,但在该实现中,后端与前端耦合得更紧密,因此我可以查询来自后端模型 class 的预期原始类型。但在我的情况下,我无权访问模型 class 并且我不知道如何检索预期的类型。
如您所见,我尝试了多种方法,但其中 none 立即奏效。如果您能帮助我使其中的 任何 工作,将不胜感激
谢谢!
它在 kotlinx.serialization 中的工作方式是有描述 classes 和结构等的序列化程序,以及 writes/read 属性和结构的代码。然后格式的工作就是将这些操作映射 to/from 一种数据格式。
kotlinx.serialization.Properties 的预期目的是支持序列化 Kotlin class to/from 类似 java.util.Properties 的结构。它的设置相当简单,因为每个嵌套的 属性 都是通过在名称前加上 属性 名称(点属性语法)来序列化的。
不幸的是,从这种格式反序列化确实需要知道预期的类型。它不只是从字符串中读取。但是,可以确定结构。您可以使用序列化程序的 descriptor
属性 来反省期望。
从我的角度来看,这种格式比它应该的要简单一些。这是自定义格式的一个很好的例子。格式之间的一个关键区别是它们是否旨在仅提供一种存储格式,或者输出是否旨在(能够)表示设计良好的 api。后者需要更复杂。