【发布时间】:2020-10-15 14:58:44
【问题描述】:
我目前正在为实验性的 KXS-properties 序列化后端苦苦挣扎,主要是因为两个原因:
- 我找不到任何文档(我认为没有)
- 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 前端编写自己的 KSerializers 时,您可以通过调用 Encoder 接口的 encodeXXX() 函数来指定编码为任何原语。现在的问题是:当我尝试解码到应该包含图元的地图时,我什至怎么知道模型类需要哪些图元?
我曾经用 Java 编写了自己的序列化器/反序列化器来了解这个主题,但在那个实现中,后端与前端的耦合更加紧密,因此我可以从模型中查询预期的原始类型后端的类。但在我的情况下,我无法访问模型类,也不知道如何检索预期的类型。
如您所见,我尝试了多种方法,但都没有立即奏效。如果您能帮助我让其中的任何发挥作用,我们将不胜感激
谢谢!
【问题讨论】:
-
这里是 kotlinx.serialization 的文档:github.com/Kotlin/kotlinx.serialization/blob/master/docs/…
-
查看Structured map keys 部分。我相信这将是序列化地图比使用属性更好的选择
-
好吧,这些事情都没有告诉我任何我还不知道的事情。关于属性序列化程序的“文档”并不比我在 kotlinx-serialization-properties 的代码 cmets 中找到的更多。 “原生支持属性格式”是什么意思?我找不到任何关于它的信息
-
抱歉,其实不是,删除了那条评论
标签: kotlin serialization deserialization properties-file kotlinx.serialization