Skip to content

Commit 40bcfae

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

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

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

Lines changed: 19 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,22 @@ 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) warn("Detected duplicate field " + field.getName() + " in class hierarchy " +
73+
field.getDeclaringClass() + ". Consider enabling FieldSerializerConfig.extendedFieldNames");
74+
break;
75+
}
76+
}
77+
}
78+
}
79+
6180
@Override
6281
public void write (Kryo kryo, Output output, T object) {
6382
int pop = pushTypeVariables();

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,28 @@
2424
import com.esotericsoftware.kryo.Kryo;
2525
import com.esotericsoftware.kryo.KryoException;
2626
import com.esotericsoftware.kryo.KryoTestCase;
27+
import com.esotericsoftware.kryo.Serializer;
28+
import com.esotericsoftware.kryo.SerializerFactory;
2729
import com.esotericsoftware.kryo.SerializerFactory.CompatibleFieldSerializerFactory;
2830

31+
import java.io.File;
32+
import java.io.FileInputStream;
33+
import java.io.FileOutputStream;
34+
import java.io.IOException;
2935
import java.io.Serializable;
3036
import java.util.Arrays;
3137
import java.util.List;
3238
import java.util.Objects;
3339

40+
import com.esotericsoftware.kryo.io.Input;
41+
import com.esotericsoftware.kryo.io.Output;
42+
import com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy;
3443
import org.apache.commons.lang.builder.EqualsBuilder;
44+
import org.junit.Assert;
3545
import org.junit.Rule;
3646
import org.junit.Test;
3747
import org.junit.rules.ExpectedException;
48+
import org.objenesis.strategy.SerializingInstantiatorStrategy;
3849

3950
/** @author Nathan Sweet */
4051
public class CompatibleFieldSerializerTest extends KryoTestCase {
@@ -642,4 +653,35 @@ public int hashCode () {
642653
return Objects.hash(value, list, serializable);
643654
}
644655
}
656+
657+
@Test
658+
public void testLogWarningOnDuplicateFieldInClassHierarchy() {
659+
kryo.setReferences(true);
660+
CompatibleFieldSerializer serializer = new CompatibleFieldSerializer(kryo, ClassWithDuplicateField.class);
661+
serializer.getCompatibleFieldSerializerConfig().setChunkedEncoding(true);
662+
serializer.getCompatibleFieldSerializerConfig().setExtendedFieldNames(false);
663+
serializer.updateFields();
664+
kryo.register(ClassWithDuplicateField.class, serializer);
665+
666+
final ClassWithDuplicateField duplicateField = new ClassWithDuplicateField();
667+
roundTrip(31, duplicateField);
668+
669+
ClassWithDuplicateField object2 = (ClassWithDuplicateField) kryo.readClassAndObject(input);
670+
assertEquals(duplicateField, object2);
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 boolean equals(Object obj) {
681+
if (this == obj) return true;
682+
if (obj == null) return false;
683+
if (getClass() != obj.getClass()) return false;
684+
return true;
685+
}
686+
}
645687
}

0 commit comments

Comments
 (0)