Skip to content

Commit 7460ae3

Browse files
Durga, V H V SekharDurga, V H V Sekhar
Durga, V H V Sekhar
authored and
Durga, V H V Sekhar
committed
Issue-4214: Use EnumSetSerializer, if property is referring EnumSet at runtime
1 parent be56569 commit 7460ae3

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

src/main/java/com/fasterxml/jackson/databind/ser/BeanPropertyWriter.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.lang.reflect.Field;
66
import java.lang.reflect.Method;
77
import java.lang.reflect.Type;
8+
import java.util.EnumSet;
89
import java.util.HashMap;
910

1011
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -20,6 +21,7 @@
2021
import com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap;
2122
import com.fasterxml.jackson.databind.ser.impl.UnwrappingBeanPropertyWriter;
2223
import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase;
24+
import com.fasterxml.jackson.databind.ser.std.EnumSetSerializer;
2325
import com.fasterxml.jackson.databind.util.Annotations;
2426
import com.fasterxml.jackson.databind.util.ClassUtil;
2527
import com.fasterxml.jackson.databind.util.NameTransformer;
@@ -702,7 +704,10 @@ public void serializeAsField(Object bean, JsonGenerator gen,
702704
}
703705
// then find serializer to use
704706
JsonSerializer<Object> ser = _serializer;
705-
if (ser == null) {
707+
if (ser == null || (value instanceof EnumSet && ser.getClass() != EnumSetSerializer.class)) {
708+
// if value instance of EnumSet, use EnumSetSerializer for EnumSet instead of
709+
// generic CollectionSerializer, since de-serialization uses EnumSetDeserializer,
710+
// if property value is of type EnumSet
706711
Class<?> cls = value.getClass();
707712
PropertySerializerMap m = _dynamicSerializers;
708713
ser = m.serializerFor(cls);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.fasterxml.jackson.databind.ser.enums;
2+
3+
import com.fasterxml.jackson.databind.BaseMapTest;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
6+
import java.util.EnumSet;
7+
import java.util.Set;
8+
9+
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
10+
import com.fasterxml.jackson.annotation.PropertyAccessor;
11+
import com.fasterxml.jackson.databind.DeserializationFeature;
12+
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
13+
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
14+
15+
public class EnumSetSerializationTest extends BaseMapTest {
16+
17+
static enum MyEnum {
18+
ITEM_A, ITEM_B;
19+
}
20+
21+
static class EnumSetHolder {
22+
private Set<MyEnum> enumSet; // use Set instead of EnumSet for type of this
23+
24+
public Set<MyEnum> getEnumSet() {
25+
return enumSet;
26+
}
27+
28+
public void setEnumSet(Set<MyEnum> enumSet) {
29+
this.enumSet = enumSet;
30+
}
31+
32+
@Override
33+
public boolean equals(Object o) {
34+
if (!(o instanceof EnumSetHolder)) {
35+
return false;
36+
}
37+
EnumSetHolder eh = (EnumSetHolder) o;
38+
if (eh == this) {
39+
return true;
40+
}
41+
if (enumSet == null) {
42+
if (eh.getEnumSet() == null) {
43+
return true;
44+
} else {
45+
return false;
46+
}
47+
} else {
48+
if (eh.getEnumSet() == null) {
49+
return false;
50+
}
51+
return enumSet.containsAll(eh.getEnumSet());
52+
}
53+
}
54+
}
55+
56+
public void testSerialization() throws Exception {
57+
ObjectMapper mapper = jsonMapperBuilder().build()
58+
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
59+
// this type information is needed in json string, for this test
60+
.activateDefaultTyping(BasicPolymorphicTypeValidator.builder().allowIfBaseType(Object.class).build(),
61+
DefaultTyping.EVERYTHING);
62+
63+
EnumSetHolder enumSetHolder = new EnumSetHolder();
64+
enumSetHolder.setEnumSet(EnumSet.allOf(MyEnum.class));
65+
String jsonStr = mapper.writeValueAsString(enumSetHolder);
66+
EnumSetHolder result = mapper.readValue(jsonStr, EnumSetHolder.class);
67+
assertEquals(result, enumSetHolder);
68+
}
69+
}

0 commit comments

Comments
 (0)