Skip to content

Commit f152a70

Browse files
author
Mr14huashao
committed
Add a WARN for extendedFieldName
1 parent 78f3332 commit f152a70

File tree

3 files changed

+76
-1
lines changed

3 files changed

+76
-1
lines changed

src/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializer.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
import com.esotericsoftware.kryo.util.ObjectMap;
3333
import com.esotericsoftware.kryo.util.Util;
3434

35+
import java.lang.reflect.Field;
36+
import java.util.HashSet;
37+
3538
/** Serializes objects using direct field assignment, providing both forward and backward compatibility. This means fields can be
3639
* added or removed without invalidating previously serialized bytes. Renaming or changing the type of a field is not supported.
3740
* Like {@link FieldSerializer}, it can serialize most classes without needing annotations.
@@ -58,6 +61,24 @@ public CompatibleFieldSerializer (Kryo kryo, Class type, CompatibleFieldSerializ
5861
this.config = config;
5962
}
6063

64+
@Override
65+
protected void initializeCachedFields() {
66+
if (!super.config.extendedFieldNames) {
67+
final HashSet hashSet = new HashSet();
68+
CachedField[] fields = cachedFields.fields;
69+
for (int i = 0, n = fields.length; i < n; i++) {
70+
final Field field = fields[i].field;
71+
if (!hashSet.add(field.getName())) {
72+
if (WARN)
73+
warn("Detected duplicate field " + field.getName() + " in class hierarchy "
74+
+ field.getDeclaringClass()
75+
+ ". Consider enabling FieldSerializerConfig.extendedFieldNames");
76+
break;
77+
}
78+
}
79+
}
80+
}
81+
6182
@Override
6283
public void write (Kryo kryo, Output output, T object) {
6384
int pop = pushTypeVariables();

test/com/esotericsoftware/kryo/WarnUnregisteredClassesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public void write (Kryo kryo, Object object) {
113113
output.flush();
114114
}
115115

116-
class LoggerStub extends Logger {
116+
public static class LoggerStub extends Logger {
117117
public List<Integer> levels = new ArrayList();
118118
public List<String> messages = new ArrayList();
119119

test/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializerTest.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@
3131
import java.util.List;
3232
import java.util.Objects;
3333

34+
import com.esotericsoftware.kryo.WarnUnregisteredClassesTest;
35+
import com.esotericsoftware.minlog.Log;
3436
import org.apache.commons.lang.builder.EqualsBuilder;
37+
import org.junit.Before;
3538
import org.junit.Rule;
3639
import org.junit.Test;
3740
import org.junit.rules.ExpectedException;
@@ -42,6 +45,16 @@ public class CompatibleFieldSerializerTest extends KryoTestCase {
4245
supportsCopy = true;
4346
}
4447

48+
WarnUnregisteredClassesTest.LoggerStub log;
49+
50+
@Before
51+
public void setUp() throws Exception {
52+
log = new WarnUnregisteredClassesTest.LoggerStub();
53+
Log.setLogger(log);
54+
Log.INFO();
55+
kryo = new Kryo();
56+
}
57+
4558
@Rule public ExpectedException exceptionRule = ExpectedException.none();
4659

4760
@Test
@@ -642,4 +655,45 @@ public int hashCode () {
642655
return Objects.hash(value, list, serializable);
643656
}
644657
}
658+
659+
@Test
660+
public void testLogWarningOnDuplicateFieldInClassHierarchy() {
661+
kryo.setReferences(true);
662+
CompatibleFieldSerializer serializer = new CompatibleFieldSerializer(kryo, ClassWithDuplicateField.class);
663+
serializer.getCompatibleFieldSerializerConfig().setChunkedEncoding(true);
664+
serializer.getCompatibleFieldSerializerConfig().setExtendedFieldNames(false);
665+
serializer.updateFields();
666+
kryo.register(ClassWithDuplicateField.class, serializer);
667+
668+
final ClassWithDuplicateField duplicateField = new ClassWithDuplicateField();
669+
roundTrip(31, duplicateField);
670+
assertEquals(2, log.messages.size());
671+
}
672+
673+
static class ClassWithDuplicateField extends SuperClassWithDuplicateField {
674+
private Boolean customNote = true;
675+
}
676+
677+
static class SuperClassWithDuplicateField implements Serializable {
678+
private Boolean customNote = false;
679+
680+
public SuperClassWithDuplicateField() {}
681+
682+
public SuperClassWithDuplicateField(Boolean customNote) {
683+
this.customNote = customNote;
684+
}
685+
686+
public boolean equals(Object obj) {
687+
if (this == obj)
688+
return true;
689+
if (obj == null)
690+
return false;
691+
if (getClass() != obj.getClass())
692+
return false;
693+
SuperClassWithDuplicateField other = (SuperClassWithDuplicateField)obj;
694+
if (customNote != other.customNote)
695+
return false;
696+
return true;
697+
}
698+
}
645699
}

0 commit comments

Comments
 (0)