Skip to content

Commit 1eaa08f

Browse files
authored
Fix #316 (#317)
1 parent 8e6d0e4 commit 1eaa08f

File tree

6 files changed

+67
-4
lines changed

6 files changed

+67
-4
lines changed

release-notes/VERSION-2.x

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ NOTE: Jackson 3.x components rely on 2.x annotations; there are no separate
1818

1919
#314: Add `JsonInclude.Value` convenience constants
2020
(contributed by @runeflobakk)
21+
#316: Make `JsonFormat.Features` java.io.Serializable
22+
(requested by @tiger9800)
2123

2224
2.20 (28-Aug-2025)
2325

src/main/java/com/fasterxml/jackson/annotation/JsonFormat.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,10 @@ public enum Feature {
381381
* @since 2.6
382382
*/
383383
public static class Features
384+
implements java.io.Serializable // @since 2.21
384385
{
386+
private static final long serialVersionUID = 1L;
387+
385388
private final int _enabled, _disabled;
386389

387390
private final static Features EMPTY = new Features(0, 0);

src/main/java/com/fasterxml/jackson/annotation/JsonIncludeProperties.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@
4747
*
4848
* @since 2.12
4949
*/
50-
public static class Value implements JacksonAnnotationValue<JsonIncludeProperties>, java.io.Serializable
50+
public static class Value implements JacksonAnnotationValue<JsonIncludeProperties>,
51+
java.io.Serializable
5152
{
5253
private static final long serialVersionUID = 1L;
5354

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.fasterxml.jackson.annotation;
2+
3+
import static org.junit.jupiter.api.Assertions.fail;
4+
5+
import java.io.ByteArrayInputStream;
6+
import java.io.ByteArrayOutputStream;
7+
import java.io.IOException;
8+
import java.io.ObjectInputStream;
9+
import java.io.ObjectOutputStream;
10+
import java.io.UncheckedIOException;
11+
12+
abstract class AnnotationTestUtil {
13+
/*
14+
/**********************************************************
15+
/* JDK ser/deser
16+
/**********************************************************
17+
*/
18+
19+
public static byte[] jdkSerialize(Object o)
20+
{
21+
ByteArrayOutputStream bytes = new ByteArrayOutputStream(2000);
22+
try (ObjectOutputStream obOut = new ObjectOutputStream(bytes)) {
23+
obOut.writeObject(o);
24+
obOut.close();
25+
return bytes.toByteArray();
26+
} catch (IOException e) {
27+
throw new UncheckedIOException(e);
28+
}
29+
}
30+
31+
@SuppressWarnings("unchecked")
32+
public static <T> T jdkDeserialize(byte[] raw)
33+
{
34+
try (ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(raw))) {
35+
return (T) objIn.readObject();
36+
} catch (ClassNotFoundException e) {
37+
fail("Missing class: "+e.getMessage());
38+
return null;
39+
} catch (IOException e) {
40+
throw new UncheckedIOException(e);
41+
}
42+
}
43+
}

src/test/java/com/fasterxml/jackson/annotation/JacksonInjectTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static org.junit.jupiter.api.Assertions.*;
66

77
public class JacksonInjectTest
8+
extends AnnotationTestUtil
89
{
910
private final static class Bogus {
1011
@JacksonInject(value="inject", useInput=OptBoolean.FALSE,
@@ -47,6 +48,11 @@ public void testFromAnnotation() throws Exception
4748
assertFalse(v.equals(EMPTY));
4849
assertFalse(EMPTY.equals(v));
4950

51+
// Verify JDK serializability
52+
byte[] b = jdkSerialize(v);
53+
JacksonInject.Value v2 = jdkDeserialize(b);
54+
assertEquals(v, v2);
55+
5056
JacksonInject ann2 = Bogus.class.getField("vanilla").getAnnotation(JacksonInject.class);
5157
v = JacksonInject.Value.from(ann2);
5258
assertEquals(JacksonInject.Value.construct(null, null, null), v,

src/test/java/com/fasterxml/jackson/annotation/FormatTest.java renamed to src/test/java/com/fasterxml/jackson/annotation/JsonFormatTest.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
* Tests to verify that it is possibly to merge {@link JsonFormat.Value}
1212
* instances for overrides.
1313
*/
14-
public class FormatTest
14+
public class JsonFormatTest
15+
extends AnnotationTestUtil
1516
{
1617
private final JsonFormat.Value EMPTY = JsonFormat.Value.empty();
1718

@@ -71,15 +72,22 @@ public void testToString() {
7172
@Test
7273
public void testFromAnnotation()
7374
{
75+
// Trivial case first:
76+
assertSame(EMPTY, JsonFormat.Value.from(null));
77+
78+
// then real one
7479
JsonFormat ann = Bogus.class.getAnnotation(JsonFormat.class);
7580
JsonFormat.Value v = JsonFormat.Value.from(ann);
7681
assertEquals("xyz", v.getPattern());
7782
assertEquals(JsonFormat.Shape.BOOLEAN, v.getShape());
7883
// note: since it's not valid, should not try access as real thing
7984
assertEquals("bogus", v.timeZoneAsString());
8085

81-
// also:
82-
assertSame(EMPTY, JsonFormat.Value.from(null));
86+
// [annotations#316]: let's also verify JDK serializability
87+
byte[] b = jdkSerialize(v);
88+
JsonFormat.Value v2 = jdkDeserialize(b);
89+
90+
assertEquals(v, v2);
8391
}
8492

8593
@Test

0 commit comments

Comments
 (0)