Settingdust
10/22/2022, 1:12 PMclass A : Map<String, A> . The map is guava multimap that not implement the map interface. But can be converted to a map.
Below is what I tried. Will throw StackOverflowError from SetSerializer
object Serializer : KSerializer<A> {
    private val serializer by lazy { MapSerializer(String.serializer(), SetSerializer(this)) }
    override val descriptor by lazy {
        SerialDescriptor(
            "A",
            serializer.descriptor
        )
    }
    override fun deserialize(decoder: Decoder) =
        A(Multimaps.newMultimap(serializer.deserialize(decoder)) { setOf() })
    override fun serialize(encoder: Encoder, value: A) =
        serializer.serialize(encoder, value.asMap().mapValues { it.value.toSet() })
}ephemient
10/23/2022, 1:01 AMephemient
10/23/2022, 1:06 AMMultimap<K, V> ≅ Map<K, Collection<V>> that would seem to be a better way to represent itephemient
10/23/2022, 1:16 AMclass MultimapSerializer<K, V>(
    keySerializer: KSerializer<K>,
    valueSerializer: KSerializer<V>,
) : KSerializer<Multimap<K, V>> {
    private val surrogateSerializer = MapSerializer(keySerializer, ListSerializer(valueSerializer))
    override val descriptor = SerialDescriptor("com.google.common.collect.Multimap", surrogateSerializer.descriptor)
    override fun serialize(encoder: Encoder, value: Multimap<K, V>) {
        encoder.encodeSerializableValue(surrogateSerializer, value.asMap().mapValues { it.value.toList() })
    }
    override fun deserialize(decoder: Decoder): Multimap<K, V> {
        return Multimaps.newListMultimap(decoder.decodeSerializableValue(surrogateSerializer), ::ArrayList)
    }
}ephemient
10/23/2022, 1:22 AMMultimap<K, V> ≅ Collection<Map.Entry<K, V>>, so this would be an option as well
class MultimapSerializer<K, V>(
    keySerializer: KSerializer<K>,
    valueSerializer: KSerializer<V>,
) : KSerializer<Multimap<K, V>> {
    private val surrogateSerializer = ListSerializer(MapEntrySerializer(keySerializer, valueSerializer))
    override val descriptor = SerialDescriptor("com.google.common.collect.Multimap", surrogateSerializer.descriptor)
    override fun serialize(encoder: Encoder, value: Multimap<K, V>) {
        encoder.encodeSerializableValue(surrogateSerializer, value.entries().toList())
    }
    override fun deserialize(decoder: Decoder): Multimap<K, V> {
        return ImmutableListMultimap.copyOf(decoder.decodeSerializableValue(surrogateSerializer))
    }
}
depending on which representation you preferSettingdust
10/23/2022, 2:19 AMJsonElementSerializer is using a function named defer for this. SetSerializer , I don't know how to defer that