From 0c6d407c24c4c73f7bf9a2e1742eaf12c9246604 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 17 Aug 2026 06:20:02 +0000 Subject: [PATCH 1/2] fix(deps): update fory to v1.6.1 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2b87acb..ad799dd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ jmh = "1.37" jmh-plugin = "0.7.3" kotlinpoet = "2.3.0" ktfmt = "0.61" -fory = "1.1.0" +fory = "1.6.1" # Caplin Dependencies datasource = "8.0.12-1871-367ddb14" From 0cea795b67a0c0633a83c1128746c6d656f8b154 Mon Sep 17 00:00:00 2001 From: Ross Anderson Date: Tue, 25 Aug 2026 10:26:21 +0100 Subject: [PATCH 2/2] fix: adapt to Fory 1.6.1 collection serializer API and meta-share behaviour Fory 1.6 changed MapSerializer/CollectionSerializer's newMap/newCollection overrides to take an extra "always advances" boolean, which broke the persistent collection serializers. Separately, scoped meta share (now enabled by default in compatible mode) is incompatible with our SerializerFactory-based exception type preservation, so guard against it and pin SCHEMA_CONSISTENT mode in the test that exercises it. --- .../util/serialization/fory/DataSourceModule.kt | 4 ++++ .../util/serialization/fory/PersistentHashMapSerializer.kt | 7 +++++-- .../util/serialization/fory/PersistentHashSetSerializer.kt | 7 +++++-- .../serialization/fory/PersistentOrderedMapSerializer.kt | 7 +++++-- .../serialization/fory/PersistentOrderedSetSerializer.kt | 7 +++++-- .../fory/ValueOrCompletionSerializationTest.kt | 2 ++ 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/DataSourceModule.kt b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/DataSourceModule.kt index 20851e4..723ffd4 100644 --- a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/DataSourceModule.kt +++ b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/DataSourceModule.kt @@ -15,6 +15,10 @@ fun Fory.registerDataSourceSerializers(preserveExceptionTypes: Boolean = false): check(config.trackingRef()) { "Tracking references must be enabled for exception types preservation" } + check(!config.isScopedMetaShareEnabled) { + "Scoped meta share is incompatible with exception types preservation; use " + + "CompatibleMode.SCHEMA_CONSISTENT (or disable meta share) on the Fory instance" + } registerSerializerFactory(ThrowableSerializerFactory) } diff --git a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentHashMapSerializer.kt b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentHashMapSerializer.kt index ef35fd8..df77ae4 100644 --- a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentHashMapSerializer.kt +++ b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentHashMapSerializer.kt @@ -13,8 +13,11 @@ internal class PersistentHashMapSerializer( type: Class>, ) : MapSerializer>(typeResolver, type, true) { - override fun newMap(readContext: ReadContext): MutableMap<*, *> { - val numElements = readMapSize(readContext.buffer) + override fun newMap( + readContext: ReadContext, + entryReadAlwaysAdvances: Boolean, + ): MutableMap<*, *> { + val numElements = readMapSize(readContext, readContext.buffer, entryReadAlwaysAdvances) setNumElements(numElements) val map = HashMap(numElements) readContext.reference(map) diff --git a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentHashSetSerializer.kt b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentHashSetSerializer.kt index 458e23e..8a034f3 100644 --- a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentHashSetSerializer.kt +++ b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentHashSetSerializer.kt @@ -13,8 +13,11 @@ internal class PersistentHashSetSerializer( type: Class>, ) : CollectionSerializer>(typeResolver, type, true) { - override fun newCollection(readContext: ReadContext): MutableCollection<*> { - val numElements = readCollectionSize(readContext.buffer) + override fun newCollection( + readContext: ReadContext, + elementReadAlwaysAdvances: Boolean, + ): MutableCollection<*> { + val numElements = readCollectionSize(readContext, readContext.buffer, elementReadAlwaysAdvances) setNumElements(numElements) val set = HashSet(numElements) readContext.reference(set) diff --git a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentOrderedMapSerializer.kt b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentOrderedMapSerializer.kt index 0969af9..4146886 100644 --- a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentOrderedMapSerializer.kt +++ b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentOrderedMapSerializer.kt @@ -13,8 +13,11 @@ internal class PersistentOrderedMapSerializer( type: Class>, ) : MapSerializer>(typeResolver, type, true) { - override fun newMap(readContext: ReadContext): MutableMap<*, *> { - val numElements = readMapSize(readContext.buffer) + override fun newMap( + readContext: ReadContext, + entryReadAlwaysAdvances: Boolean, + ): MutableMap<*, *> { + val numElements = readMapSize(readContext, readContext.buffer, entryReadAlwaysAdvances) setNumElements(numElements) val map = LinkedHashMap(numElements) readContext.reference(map) diff --git a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentOrderedSetSerializer.kt b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentOrderedSetSerializer.kt index 8a1052c..b1fe5ee 100644 --- a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentOrderedSetSerializer.kt +++ b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/PersistentOrderedSetSerializer.kt @@ -13,8 +13,11 @@ internal class PersistentOrderedSetSerializer( type: Class>, ) : CollectionSerializer>(typeResolver, type, true) { - override fun newCollection(readContext: ReadContext): MutableCollection<*> { - val numElements = readCollectionSize(readContext.buffer) + override fun newCollection( + readContext: ReadContext, + elementReadAlwaysAdvances: Boolean, + ): MutableCollection<*> { + val numElements = readCollectionSize(readContext, readContext.buffer, elementReadAlwaysAdvances) setNumElements(numElements) val set = LinkedHashSet(numElements) readContext.reference(set) diff --git a/util/src/test/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/ValueOrCompletionSerializationTest.kt b/util/src/test/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/ValueOrCompletionSerializationTest.kt index e4b1761..0c2e6e8 100644 --- a/util/src/test/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/ValueOrCompletionSerializationTest.kt +++ b/util/src/test/kotlin/com/caplin/integration/datasourcex/util/serialization/fory/ValueOrCompletionSerializationTest.kt @@ -5,6 +5,7 @@ import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.kotest.matchers.types.shouldBeInstanceOf import org.apache.fory.Fory +import org.apache.fory.config.CompatibleMode import org.apache.fory.config.Language class CustomException(val customMessage: String) : Exception(customMessage) @@ -31,6 +32,7 @@ class ValueOrCompletionSerializationTest : Fory.builder() .withLanguage(Language.JAVA) .requireClassRegistration(false) + .withCompatibleMode(CompatibleMode.SCHEMA_CONSISTENT) .withRefTracking(true) .build() .registerDataSourceSerializers(preserveExceptionTypes = true)