From 1c7e79026f82d6ede020ce59b682619a008bb139 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 17 Feb 2026 22:13:57 +0100 Subject: [PATCH] Skip serialization of potentially non-serializable cached state Closes gh-36346 (cherry picked from commit 22bd8bd704390ee618f19d32e5ecc6ad1cd0b39c) --- .../org/springframework/core/ResolvableType.java | 8 ++++---- .../core/ResolvableTypeTests.java | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/ResolvableType.java b/spring-core/src/main/java/org/springframework/core/ResolvableType.java index 915b9dba95e..b68ec1460e0 100644 --- a/spring-core/src/main/java/org/springframework/core/ResolvableType.java +++ b/spring-core/src/main/java/org/springframework/core/ResolvableType.java @@ -128,16 +128,16 @@ public class ResolvableType implements Serializable { private Class resolved; @Nullable - private volatile ResolvableType superType; + private transient volatile ResolvableType superType; @Nullable - private volatile ResolvableType[] interfaces; + private transient volatile ResolvableType[] interfaces; @Nullable - private volatile ResolvableType[] generics; + private transient volatile ResolvableType[] generics; @Nullable - private volatile Boolean unresolvableGenerics; + private transient volatile Boolean unresolvableGenerics; /** diff --git a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java index 104e059ceec..c01ade2347b 100644 --- a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java +++ b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java @@ -1335,6 +1335,22 @@ class ResolvableTypeTests { assertThat(deserializedNone).isSameAs(ResolvableType.NONE); } + @Test + void serializeWithCachedState() throws Exception { + ResolvableType type = ResolvableType.forClass(List.class); + testSerialization(type); + type.getSuperType(); + type.getInterfaces(); + type.getGenerics(); + type.hasUnresolvableGenerics(); + testSerialization(type); + type.getSuperType(); + type.getInterfaces(); + type.getGenerics(); + type.hasUnresolvableGenerics(); + testSerialization(type); + } + @Test void canResolveVoid() { ResolvableType type = ResolvableType.forClass(void.class);