Skip to content

Commit

Permalink
Workaround object serialization issue
Browse files Browse the repository at this point in the history
  • Loading branch information
nsk90 committed Oct 16, 2024
1 parent 35c8df2 commit 2ffa18c
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ package ru.nsk.kstatemachine.serialization.persistence

import kotlinx.serialization.*
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.builtins.nullable
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
Expand Down Expand Up @@ -195,29 +196,27 @@ private object SerializableGeneratedEventSerializer : KSerializer<SerializableGe
}
}

/**
* See an issue https://github.com/Kotlin/kotlinx.serialization/issues/2830
*/
private object SerializableGeneratedEventEventTypeStartSerializer : KSerializer<EventType.Start> {
@OptIn(InternalSerializationApi::class)
override val descriptor = buildClassSerialDescriptor(
"ru.nsk.kstatemachine.event.SerializableGeneratedEvent.EventType.Start",
) {
element<Boolean>("ignore_fix_bug")
element("ignore_this_field", Boolean.serializer().nullable.descriptor, isOptional = true)
}

override fun serialize(encoder: Encoder, value: EventType.Start) {
encoder.encodeStructure(descriptor) {
encodeBooleanElement(descriptor, 0, false)
encodeNullableSerializableElement(descriptor, 0, Boolean.serializer().nullable, null)
}
}

override fun deserialize(decoder: Decoder): EventType.Start {
return decoder.decodeStructure(descriptor) {
var eventType =
makeNullPointerFailure<Boolean>("required eventType property is absent")
while (true) {
when (val index = decodeElementIndex(descriptor)) {
0 -> eventType = Result.success(
decodeBooleanElement(descriptor, 0)
)
0 -> decodeNullableSerializableElement(descriptor, 0, Boolean.serializer().nullable) // ignore
CompositeDecoder.DECODE_DONE -> break
else -> error("Unexpected index: $index")
}
Expand All @@ -227,16 +226,30 @@ private object SerializableGeneratedEventEventTypeStartSerializer : KSerializer<
}
}

/**
* See an issue https://github.com/Kotlin/kotlinx.serialization/issues/2830
*/
private object SerializableGeneratedEventEventTypeStopSerializer : KSerializer<EventType.Stop> {
override val descriptor =
buildClassSerialDescriptor("ru.nsk.kstatemachine.event.SerializableGeneratedEvent.EventType.Stop")
buildClassSerialDescriptor("ru.nsk.kstatemachine.event.SerializableGeneratedEvent.EventType.Stop") {
element("ignore_this_field", Boolean.serializer().nullable.descriptor, isOptional = true)
}

override fun serialize(encoder: Encoder, value: EventType.Stop) {
encoder.encodeStructure(descriptor) {}
encoder.encodeStructure(descriptor) {
encodeNullableSerializableElement(descriptor, 0, Boolean.serializer().nullable, null)
}
}

override fun deserialize(decoder: Decoder): EventType.Stop {
return decoder.decodeStructure(descriptor) {
while (true) {
when (val index = decodeElementIndex(descriptor)) {
0 -> decodeNullableSerializableElement(descriptor, 0, Boolean.serializer().nullable) // ignore
CompositeDecoder.DECODE_DONE -> break
else -> error("Unexpected index: $index")
}
}
EventType.Stop
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* All rights reserved.
*/

package ru.nsk.kstatemachine
package ru.nsk.kstatemachine.coroutines

import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.StringSpec
Expand All @@ -15,8 +15,11 @@ import io.mockk.verifySequence
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.take
import ru.nsk.kstatemachine.SecondEvent
import ru.nsk.kstatemachine.SwitchEvent
import ru.nsk.kstatemachine.statemachine.StateMachineNotification.*
import ru.nsk.kstatemachine.event.StartEvent
import ru.nsk.kstatemachine.mockkCallbacks
import ru.nsk.kstatemachine.state.*
import ru.nsk.kstatemachine.statemachine.*
import ru.nsk.kstatemachine.transition.onTriggered
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@
* All rights reserved.
*/

package ru.nsk.kstatemachine.serialization
package ru.nsk.kstatemachine.serialization.persistence

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.collections.shouldHaveSize
import io.kotest.matchers.shouldBe
import io.kotest.matchers.types.shouldBeInstanceOf
import kotlinx.coroutines.CoroutineScope
import kotlinx.serialization.PolymorphicSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
Expand All @@ -22,10 +21,8 @@ import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass
import ru.nsk.kstatemachine.event.DataEvent
import ru.nsk.kstatemachine.event.Event
import ru.nsk.kstatemachine.event.SerializableGeneratedEvent
import ru.nsk.kstatemachine.persistence.RecordedEvents
import ru.nsk.kstatemachine.persistence.restoreByRecordedEvents
import ru.nsk.kstatemachine.serialization.persistence.KStateMachineSerializersModule
import ru.nsk.kstatemachine.state.*
import ru.nsk.kstatemachine.statemachine.StateMachine
import ru.nsk.kstatemachine.statemachine.buildCreationArguments
Expand Down

0 comments on commit 2ffa18c

Please sign in to comment.