Skip to content

Commit 12abf28

Browse files
authored
Make TypeIdResolvers serializable for Jackson 2.15 (#4304)
1 parent 56356fe commit 12abf28

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/ClassNameIdResolver.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
*/
1818
public class ClassNameIdResolver
1919
extends TypeIdResolverBase
20+
implements java.io.Serializable // @since 2.17
2021
{
22+
private static final long serialVersionUID = 1L;
23+
2124
private final static String JAVA_UTIL_PKG = "java.util.";
2225

2326
protected final PolymorphicTypeValidator _subTypeValidator;

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/TypeNameIdResolver.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
import com.fasterxml.jackson.databind.jsontype.NamedType;
1313

1414
public class TypeNameIdResolver extends TypeIdResolverBase
15+
implements java.io.Serializable // @since 2.17
1516
{
17+
private static final long serialVersionUID = 1L;
18+
1619
protected final MapperConfig<?> _config;
1720

1821
/**

src/test/java/com/fasterxml/jackson/databind/TestJDKSerialization.java

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
import java.io.*;
44
import java.util.*;
55

6-
import com.fasterxml.jackson.annotation.JsonAnyGetter;
7-
import com.fasterxml.jackson.annotation.JsonAnySetter;
8-
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
6+
import com.fasterxml.jackson.annotation.*;
7+
import org.junit.jupiter.api.Test;
98

109
import com.fasterxml.jackson.databind.type.TypeFactory;
1110

@@ -59,6 +58,37 @@ public Map<String,Object> properties() {
5958
}
6059
}
6160

61+
62+
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
63+
@JsonSubTypes({@JsonSubTypes.Type(value = FooClassImpl.class)})
64+
public class FooClass { }
65+
class FooClassImpl extends FooClass { }
66+
67+
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
68+
@JsonSubTypes({@JsonSubTypes.Type(value = FooDeductionImpl.class)})
69+
public class FooDeduction { }
70+
class FooDeductionImpl extends FooDeduction { }
71+
72+
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
73+
@JsonSubTypes({@JsonSubTypes.Type(value = FooNoneImpl.class)})
74+
public class FooNone { }
75+
class FooNoneImpl extends FooNone { }
76+
77+
@JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM)
78+
@JsonSubTypes({@JsonSubTypes.Type(value = FooCustomImpl.class)})
79+
public class FooCustom { }
80+
class FooCustomImpl extends FooCustom { }
81+
82+
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS)
83+
@JsonSubTypes({@JsonSubTypes.Type(value = FooMinimalClassImpl.class)})
84+
public class FooMinimalClass { }
85+
class FooMinimalClassImpl extends FooMinimalClass { }
86+
87+
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
88+
@JsonSubTypes({@JsonSubTypes.Type(value = FooNameImpl.class)})
89+
public class FooName { }
90+
class FooNameImpl extends FooName { }
91+
6292
/*
6393
/**********************************************************
6494
/* Tests for individual objects
@@ -191,4 +221,28 @@ public void testTypeFactory() throws Exception
191221
t = orig.constructType(JavaType.class);
192222
assertEquals(JavaType.class, t.getRawClass());
193223
}
224+
225+
// [databind#4303]
226+
public void testObjectReaderSerializationWithPolymorphism()
227+
throws Exception
228+
{
229+
Class<?>[] classes = new Class<?>[] {
230+
FooClass.class,
231+
FooDeduction.class,
232+
FooNone.class,
233+
FooCustom.class,
234+
FooMinimalClass.class,
235+
FooName.class
236+
};
237+
238+
for (Class<?> clazz : classes) {
239+
ObjectReader reader = newJsonMapper()
240+
.readerFor(clazz);
241+
242+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
243+
ObjectOutputStream oos = new ObjectOutputStream(baos);
244+
oos.writeObject(reader); // This line should throw NotSerializableException
245+
oos.close();
246+
}
247+
}
194248
}

0 commit comments

Comments
 (0)