Skip to content

Commit

Permalink
Ensure that SettingsEncoder is correctly reset to initial state after…
Browse files Browse the repository at this point in the history
… finishing an encoding, in case of reuse such as with delegates. Fixes #217
  • Loading branch information
russhwolf committed Nov 26, 2024
1 parent 0f9a6de commit d656c58
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

- Update to Kotlin 2.0.21, Gradle 8.10, and Android Gradle Plugin 8.5.2
- Add `wasmWasi` support to `multiplatform-settings-coroutines` and `multiplatform-settings-serialization`.
- Fix an issue in `multiplatform-settings-serialization` where delegates might return wrong values or crash (#217).

## v1.2.0 *(2024-09-01)* ##

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import kotlinx.serialization.modules.SerializersModule
@ExperimentalSerializationApi
internal class SettingsEncoder(
private val settings: Settings,
key: String,
private val key: String,
public override val serializersModule: SerializersModule
) : AbstractEncoder() {

Expand Down Expand Up @@ -60,6 +60,10 @@ internal class SettingsEncoder(
public override fun endStructure(descriptor: SerialDescriptor) {
depth--
keyStack.removeLast()
if (keyStack.isEmpty()) {
// We've reached the end of everything, so reset for potential encoder reuse
keyStack.add(key)
}
}

public override fun beginCollection(descriptor: SerialDescriptor, collectionSize: Int): CompositeEncoder {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.russhwolf.settings.MapSettings
import com.russhwolf.settings.Settings
import com.russhwolf.settings.contains
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.builtins.ListSerializer
Expand Down Expand Up @@ -1023,6 +1024,46 @@ class SettingsSerializationTest {
preferences.list = list
assertEquals(expected = list, actual = preferences.list)
}

@Test
fun issue_217() {
val settings = MapSettings()

@Serializable
data class MyItemDto(
@SerialName("name")
val name: String,
@SerialName("id")
val id: String,
)

var myItems: List<MyItemDto> by settings.serializedValue(
ListSerializer(MyItemDto.serializer()),
"MY_ITEMS",
emptyList(),
)

myItems = emptyList()
assertEquals(emptyList(), myItems)
myItems = listOf(
MyItemDto(
name = "Name",
id = "Id",
)
)
assertEquals(
listOf(
MyItemDto(
name = "Name",
id = "Id",
)
), myItems
)

// Should not crash
myItems = emptyList()
myItems = emptyList()
}
}

@Serializable
Expand Down

0 comments on commit d656c58

Please sign in to comment.