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 cc4566002c5..af01421dc27 100644 --- a/spring-core/src/main/java/org/springframework/core/ResolvableType.java +++ b/spring-core/src/main/java/org/springframework/core/ResolvableType.java @@ -123,13 +123,13 @@ public class ResolvableType implements Serializable { private @Nullable Class resolved; - private volatile @Nullable ResolvableType superType; + private transient volatile @Nullable ResolvableType superType; - private volatile ResolvableType @Nullable [] interfaces; + private transient volatile ResolvableType @Nullable [] interfaces; - private volatile ResolvableType @Nullable [] generics; + private transient volatile ResolvableType @Nullable [] generics; - private volatile @Nullable Boolean unresolvableGenerics; + private transient volatile @Nullable 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);