Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin Serialization: How to serialize MutableStateFlow<Float>?

Tags:

kotlin

I have the following code

@Serializeable
class Car {
   val speed = MutableStateFlow<Int>(0)
   var isMoving: Boolean = false
}

The question is how to serialize MutableStateFlow?

like image 742
vkrott Avatar asked Sep 21 '25 09:09

vkrott


1 Answers

You need to create a specialized serializer for MutableStateFlow<Int>.

Either based on generic serializer suggested by @Tenfour04

object MutableStateFlowOfIntsSerializer :
    KSerializer<MutableStateFlow<Int>> by MutableStateFlowSerializer(Int.serializer())

class MutableStateFlowSerializer<T>(private val dataSerializer: KSerializer<T>) : KSerializer<MutableStateFlow<T>> {
    override val descriptor: SerialDescriptor = dataSerializer.descriptor
    override fun serialize(encoder: Encoder, value: MutableStateFlow<T>) = dataSerializer.serialize(encoder, value.value)
    override fun deserialize(decoder: Decoder) = MutableStateFlow(dataSerializer.deserialize(decoder))
}

or from scratch:

object MutableStateFlowOfIntsSerializer : KSerializer<MutableStateFlow<Int>> {
    override val descriptor: SerialDescriptor = Int.serializer().descriptor
    override fun serialize(encoder: Encoder, value: MutableStateFlow<Int>) =
        Int.serializer().serialize(encoder, value.value)

    override fun deserialize(decoder: Decoder) = MutableStateFlow(Int.serializer().deserialize(decoder))
}

and wire it to the speed field:

@Serializable
class Car {
    @Serializable(with = MutableStateFlowOfIntsSerializer::class)
    val speed = MutableStateFlow(0)
    var isMoving: Boolean = false
}

Note, that this serialization approach will serialize speed field regardless of encodeDefaults = false setting

like image 129
Михаил Нафталь Avatar answered Sep 23 '25 11:09

Михаил Нафталь