diff --git a/src/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializer.java b/src/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializer.java index cab2817b5..7f173b998 100644 --- a/src/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializer.java +++ b/src/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializer.java @@ -142,6 +142,12 @@ public T read (Kryo kryo, Input input, Class type) { continue; } if (registration == null) { + try { + if (cachedField != null && cachedField.canBeNull) { + cachedField.field.set(object, null); + } + } catch (IllegalAccessException e) { + } if (chunked) inputChunked.nextChunk(); continue; } diff --git a/test/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializerTest.java b/test/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializerTest.java index 9cafdc64c..e08d6f2b5 100644 --- a/test/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializerTest.java +++ b/test/com/esotericsoftware/kryo/serializers/CompatibleFieldSerializerTest.java @@ -513,6 +513,20 @@ void testClassWithGenericField () { roundTrip(9, new ClassWithGenericField<>(1)); } + // https://github.com/EsotericSoftware/kryo/issues/851 + @Test + void testClassWithDefaultValueField () { + CompatibleFieldSerializer.CompatibleFieldSerializerConfig config = new CompatibleFieldSerializer.CompatibleFieldSerializerConfig(); + config.setChunkedEncoding(true); + config.setReadUnknownFieldData(true); + kryo.setDefaultSerializer(new CompatibleFieldSerializerFactory(config)); + kryo.register(ClassWithDefaultValueField.class); + + final ClassWithDefaultValueField o = new ClassWithDefaultValueField(); + o.setValue(null); + roundTrip(10, o); + } + public static class TestClass { public String text = "something"; public int moo = 120; @@ -809,4 +823,29 @@ public boolean equals (Object o) { return Objects.equals(value, that.value); } } + + public static class ClassWithDefaultValueField { + + private Integer value = 10; + + public Integer getValue () { + return value; + } + + public void setValue (Integer value) { + this.value = value; + } + + @Override + public boolean equals (Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final ClassWithDefaultValueField that = (ClassWithDefaultValueField)o; + return Objects.equals(value, that.value); + } + } }