【问题标题】:kotlinx-serialization - How to serialize ONLY properties on interfacekotlinx-serialization - 如何仅序列化接口上的属性
【发布时间】:2021-06-22 19:20:07
【问题描述】:

文档here显示,在序列化实现接口的对象时,只要子类为@Serializable,就可以序列化。但是,这会序列化我不想序列化的子类上的许多属性。

示例:

interface Test {
    val prop1 : String
    val prop2 : String
}

@Serializable
class TestImpl(
    override var prop1,
    override var prop2, 
) : Request {
    var dontWantSerialized = 0
}

当我对其进行序列化时,属性“dontWantSerialized”也会出现在 json 中。我想创建一个仅包含接口属性的 json 有效负载。这可能吗?我也不希望它也需要“type”属性,因为我只希望在编译单元中实现一个接口。有没有办法通过 kotlinx 序列化来完成这个?

【问题讨论】:

    标签: kotlin kotlinx.serialization


    【解决方案1】:

    我想创建一个仅包含来自 界面

    @kotlinx.serialization.Transient 添加到您不希望被序列化的任何属性

    我也不希望它也需要“类型”属性

    在定义您的序列化程序模块时,添加一个default 序列化程序:

    Json {
      this.serializersModule = SerializersModule {
        polymorphic(Test::class) {
          subclass(TestImpl::class, TestImpl.serializer())
          this.default { TestImpl.serializer() }
        }
      }
    }
    

    【讨论】:

    • 对于第二部分,我尝试了您的建议here,但我仍然得到了结果{"type":"TestImpl","prop1":"blah","prop2":"blah"}。我在底部看到了section,现在我看到了您在说什么,但是这种行为仍然出乎意料。为什么还包括类型?
    • @FatalCatharsis 添加default 有助于解码而无需在json 中包含type。序列化的方式是使用多态序列化程序,这相当于添加typeencoder.encodeToString(PolymorphicSerializer(Test::class), data)。如果不希望它添加鉴别器,可以使用特定的类序列化器进行序列化。例如encoder.encodeToString(TestImpl.serializer(), data)encoder.encodeToString<TestImpl>(data)
    猜你喜欢
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2020-09-15
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多