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