【问题标题】:Decoding and encoding strings for kotlinx.serialization.propertieskotlinx.serialization.properties 的解码和编码字符串
【发布时间】:2020-10-15 14:58:44
【问题描述】:

我目前正在为实验性的 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 并没有真正的原语)。我怀疑这是因为当您为 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


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,我现在也弄清楚了描述符部分。我目前正在努力将整个事情放在一起。我考虑将它作为一个包部署在某个地方,因为它绝对不是微不足道的任务(正如我必须找出的那样)。谢谢!
猜你喜欢
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多