From 12b1164d318fdd8a263d63b516f934aa09a55e15 Mon Sep 17 00:00:00 2001 From: Ross Anderson Date: Tue, 25 Aug 2026 10:50:40 +0100 Subject: [PATCH 1/2] fix(deps): update fory to v1.6.1 (#43) * fix(deps): update fory to v1.6.1 * 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. --------- Co-authored-by: Renovate Bot (cherry picked from commit 6b8097f6f72422ad24f7c69ddfda9c377a86e201) --- gradle/libs.versions.toml | 2 +- .../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 ++ 7 files changed, 27 insertions(+), 9 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c255a2f..db64581 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,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" 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) From d5a21297a238fd3dda226009c53fcfe2c644d879 Mon Sep 17 00:00:00 2001 From: Ross Anderson Date: Tue, 1 Sep 2026 11:19:14 +0100 Subject: [PATCH 2/2] chore(deps): update fory to v1.7.0 Mostly Scala/Kotlin JSON and streaming features unrelated to this repo's usage, but includes deserialization-path hardening (bounded metadata decompression, tighter disallowed-class list) relevant to StreamLink payload handling. Wire format unchanged; no protocol/API impact here. --- 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 db64581..df00768 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,7 @@ jmh = "1.37" jmh-plugin = "0.7.3" kotlinpoet = "2.3.0" ktfmt = "0.61" -fory = "1.6.1" +fory = "1.7.0" # Caplin Dependencies datasource = "8.0.12-1871-367ddb14"