Skip to content

Instantly share code, notes, and snippets.

@hierynomus
Last active February 19, 2021 07:41
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hierynomus/a2f143a555466f83d9bc to your computer and use it in GitHub Desktop.
Save hierynomus/a2f143a555466f83d9bc to your computer and use it in GitHub Desktop.
Kryo 2.24.0 / 3.0.3 StackOverflowError with generics
apply plugin: "java"
repositories {
mavenCentral()
}
dependencies {
testCompile "junit:junit:4.12"
//testCompile "com.esotericsoftware.kryo:kryo:2.24.0"
testCompile "com.esotericsoftware:kryo:3.0.3"
}
Testing started at 21:58 ...
21:58:14: Executing external tasks 'cleanTest test --tests "StackOverflowTest_2_24_0.goBananas"'...
:cleanTest
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
StackOverflowTest_2_24_0 > goBananas FAILED
java.lang.StackOverflowError
at java.util.HashMap.hash(HashMap.java:338)
at java.util.HashMap.get(HashMap.java:556)
at com.esotericsoftware.kryo.Generics.getConcreteClass(Generics.java:43)
at com.esotericsoftware.kryo.Generics.getConcreteClass(Generics.java:44)
at com.esotericsoftware.kryo.Generics.getConcreteClass(Generics.java:44)
at com.esotericsoftware.kryo.Generics.getConcreteClass(Generics.java:44)
at com.esotericsoftware.kryo.Generics.getConcreteClass(Generics.java:44)
at com.esotericsoftware.kryo.Generics.getConcreteClass(Generics.java:44)
[...]
at com.esotericsoftware.kryo.Generics.getConcreteClass(Generics.java:44)
java.lang.StackOverflowError
1 test completed, 1 failed
:test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/ajvanerp/src/hierynomus/kryoverflow/build/reports/tests/index.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 5.514 secs
There were failing tests. See the report at: file:///Users/ajvanerp/src/hierynomus/kryoverflow/build/reports/tests/index.html
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.FastOutput;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
public class StackOverflowTest_2_24_0 {
@Test
public void thisWorks() {
FooRef fooRef = new FooRef();
GenericFoo<FooRef> genFoo1 = new GenericFoo<>(fooRef);
GenericFoo<FooRef> genFoo2 = new GenericFoo<>(fooRef);
List<GenericFoo<?>> foos = new ArrayList<>();
// Note the order of the items in the list (vs goBananas)
foos.add(genFoo1);
foos.add(genFoo2);
new FooContainer(foos);
Kryo kryo = new Kryo();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
kryo.writeObject(new FastOutput(outputStream), genFoo1);
}
@Test
public void goBananas() {
FooRef fooRef = new FooRef();
GenericFoo<FooRef> genFoo1 = new GenericFoo<>(fooRef);
GenericFoo<FooRef> genFoo2 = new GenericFoo<>(fooRef);
List<GenericFoo<?>> foos = new ArrayList<>();
// Note the order of the items in the list (vs thisWorks)
foos.add(genFoo2);
foos.add(genFoo1);
new FooContainer(foos);
Kryo kryo = new Kryo();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
kryo.writeObject(new FastOutput(outputStream), genFoo1);
}
}
class FooContainer {
List<GenericFoo<?>> foos;
public FooContainer(List<GenericFoo<?>> foos) {
this.foos = foos;
for (GenericFoo<?> foo : foos) {
foo.container = this;
}
}
}
interface Foo {}
class FooRef implements Foo {}
class GenericFoo<B extends Foo> implements Foo {
private Map<String, Object> map = Collections.singletonMap("myself", (Object) this);
B foo;
FooContainer container;
public GenericFoo(B foo) {
this.foo = foo;
}
}
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.FastOutput;
import com.esotericsoftware.minlog.Log;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* Created by ajvanerp on 24/08/15.
*/
public class ThreeLevelsDownStackOverflow {
@Test
public void goBananas() {
BarRef barRef = new BarRef();
GenericBar<BarRef> genBar1 = new GenericBar<>(barRef);
GenericBar<BarRef> genBar2 = new GenericBar<>(barRef);
List<GenericBar<?>> bars = new ArrayList<>();
bars.add(genBar2);
bars.add(genBar1);
// Now added another generics class in the mix.
// During serialization there now is no direct link between genericsScope and parentScope
// But rather there is a cycle.
new GenericContainer<>(new BarContainer(bars));
Kryo kryo = new Kryo();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Log.set(Log.LEVEL_TRACE);
kryo.writeObject(new FastOutput(outputStream), genBar1);
}
}
class GenericContainer<T extends Bar> {
BarContainer barContainer;
public GenericContainer(BarContainer barContainer) {
this.barContainer = barContainer;
for (GenericBar<?> foo : barContainer.foos) {
foo.container = this;
}
}
}
class BarContainer {
List<GenericBar<?>> foos;
public BarContainer(List<GenericBar<?>> foos) {
this.foos = foos;
}
}
interface Bar {}
class BarRef implements Bar {}
class GenericBar<B extends Bar> implements Bar {
private Map<String, Object> map = Collections.singletonMap("myself", (Object) this);
B foo;
GenericContainer<?> container;
public GenericBar(B foo) {
this.foo = foo;
}
}
00:00 TRACE: [kryo] Write initial object reference 0: GenericFoo
00:00 DEBUG: [kryo] Write: GenericFoo
00:00 TRACE: [kryo] Optimize ints: true
00:00 TRACE: [kryo] Class GenericFoo has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=B type bounds=[interface Foo]
00:00 TRACE: [kryo] Trying to use kryo.getGenericScope
00:00 TRACE: [kryo] Settting a new generics scope for class GenericFoo: {}
00:00 TRACE: [kryo] Field 'map' of type interface java.util.Map of generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
00:00 TRACE: [kryo] Processing generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Processing actual type class java.lang.String (java.lang.Class)
00:00 TRACE: [kryo] Processing actual type class java.lang.Object (java.lang.Class)
00:00 TRACE: [kryo] Class java.util.Map has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=K type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for K is: java.lang.String
00:00 TRACE: [kryo] Type parameter variable: name=V type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for V is: java.lang.Object
00:00 TRACE: [kryo] Generics scope of field 'map' of class java.util.Map<java.lang.String, java.lang.Object> is {V=class java.lang.Object, K=class java.lang.String}
00:00 TRACE: [kryo] Determined concrete class of parametrized 'map' to be java.util.Map<java.lang.String, java.lang.Object> where type parameters are [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Field generics: [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Field 'foo' of type interface Foo of generic type B
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
00:00 TRACE: [kryo] Generics scope of field 'foo' of class B is null
00:00 TRACE: [kryo] Field container: class FooContainer
00:00 TRACE: [kryo] Register class name: GenericFoo (com.esotericsoftware.kryo.serializers.FieldSerializer)
00:00 TRACE: [kryo] FieldSerializer.write fields of class: GenericFoo
00:00 TRACE: [kryo] Settting a new generics scope for class GenericFoo: {}
00:00 TRACE: [kryo] Write field: container (GenericFoo) pos=1
00:00 TRACE: [kryo] Optimize ints: true
00:00 TRACE: [kryo] Field 'foos' of type interface java.util.List of generic type java.util.List<GenericFoo<?>>
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
00:00 TRACE: [kryo] Processing generic type java.util.List<GenericFoo<?>>
00:00 TRACE: [kryo] Processing actual type GenericFoo<?> (sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl)
00:00 TRACE: [kryo] Class java.util.List has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=E type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for E is: GenericFoo
00:00 TRACE: [kryo] Generics scope of field 'foos' of class java.util.List<GenericFoo<?>> is {E=class GenericFoo}
00:00 TRACE: [kryo] Determined concrete class of parametrized 'foos' to be java.util.List<GenericFoo<?>> where type parameters are [class GenericFoo]
00:00 TRACE: [kryo] Field generics: [class GenericFoo]
00:00 TRACE: [kryo] Register class name: FooContainer (com.esotericsoftware.kryo.serializers.FieldSerializer)
00:00 TRACE: [kryo] Write class name: FooContainer
00:00 TRACE: [kryo] Write initial object reference 1: FooContainer
00:00 DEBUG: [kryo] Write: FooContainer
00:00 TRACE: [kryo] FieldSerializer.write fields of class: FooContainer
00:00 TRACE: [kryo] Write field: foos (FooContainer) pos=16
00:00 TRACE: [kryo] Register class name: java.util.ArrayList (com.esotericsoftware.kryo.serializers.CollectionSerializer)
00:00 TRACE: [kryo] Write class name: java.util.ArrayList
00:00 TRACE: [kryo] Write initial object reference 2: [GenericFoo@5d3411d, GenericFoo@3c679bde]
00:00 DEBUG: [kryo] Write: [GenericFoo@5d3411d, GenericFoo@3c679bde]
00:00 TRACE: [kryo] Write class name: GenericFoo
00:00 TRACE: [kryo] Write initial object reference 3: GenericFoo
00:00 DEBUG: [kryo] Write: GenericFoo
00:00 TRACE: [kryo] FieldSerializer.write fields of class: GenericFoo
00:00 TRACE: [kryo] Settting a new generics scope for class GenericFoo: {}
00:00 TRACE: [kryo] Write field: container (GenericFoo) pos=52
00:00 TRACE: [kryo] Write class name reference 0: FooContainer
00:00 DEBUG: [kryo] Write object reference 1: FooContainer
00:00 TRACE: [kryo] Write field: foo (GenericFoo) pos=55
00:00 TRACE: [kryo] Optimize ints: true
00:00 TRACE: [kryo] Register class name: FooRef (com.esotericsoftware.kryo.serializers.FieldSerializer)
00:00 TRACE: [kryo] Write class name: FooRef
00:00 TRACE: [kryo] Write initial object reference 4: FooRef
00:00 DEBUG: [kryo] Write: FooRef
00:00 TRACE: [kryo] FieldSerializer.write fields of class: FooRef
00:00 TRACE: [kryo] Write field: map (GenericFoo) pos=64
00:00 TRACE: [kryo] Register class name: java.util.Collections$SingletonMap (com.esotericsoftware.kryo.serializers.DefaultSerializers$CollectionsSingletonMapSerializer)
00:00 TRACE: [kryo] Write class name: java.util.Collections$SingletonMap
00:00 TRACE: [kryo] Write initial object reference 5: {myself=GenericFoo@5d3411d}
00:00 DEBUG: [kryo] Write: {myself=GenericFoo@5d3411d}
00:00 TRACE: [kryo] Write class 1: String
00:00 TRACE: [kryo] Write initial object reference 6: myself
00:00 TRACE: [kryo] Write: myself
00:00 TRACE: [kryo] Write class name reference 2: GenericFoo
00:00 DEBUG: [kryo] Write object reference 3: GenericFoo
00:00 TRACE: [kryo] Class GenericFoo has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=B type bounds=[interface Foo]
00:00 TRACE: [kryo] Trying to use kryo.getGenericScope
00:00 TRACE: [kryo] Object graph complete.
java.lang.StackOverflowError
00:00 TRACE: [kryo] Write initial object reference 0: GenericFoo
00:00 DEBUG: [kryo] Write: GenericFoo
00:00 TRACE: [kryo] Optimize ints: true
00:00 TRACE: [kryo] Class GenericFoo has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=B type bounds=[interface Foo]
00:00 TRACE: [kryo] Trying to use kryo.getGenericScope
00:00 TRACE: [kryo] Settting a new generics scope for class GenericFoo: {}
00:00 TRACE: [kryo] Field 'map' of type interface java.util.Map of generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
00:00 TRACE: [kryo] Processing generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Processing actual type class java.lang.String (java.lang.Class)
00:00 TRACE: [kryo] Processing actual type class java.lang.Object (java.lang.Class)
00:00 TRACE: [kryo] Class java.util.Map has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=K type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for K is: java.lang.String
00:00 TRACE: [kryo] Type parameter variable: name=V type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for V is: java.lang.Object
00:00 TRACE: [kryo] Generics scope of field 'map' of class java.util.Map<java.lang.String, java.lang.Object> is {V=class java.lang.Object, K=class java.lang.String}
00:00 TRACE: [kryo] Determined concrete class of parametrized 'map' to be java.util.Map<java.lang.String, java.lang.Object> where type parameters are [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Field generics: [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Field 'foo' of type interface Foo of generic type B
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
00:00 TRACE: [kryo] Generics scope of field 'foo' of class B is null
00:00 TRACE: [kryo] Field container: class FooContainer
00:00 TRACE: [kryo] Register class name: GenericFoo (com.esotericsoftware.kryo.serializers.FieldSerializer)
00:00 TRACE: [kryo] FieldSerializer.write fields of class: GenericFoo
00:00 TRACE: [kryo] Settting a new generics scope for class GenericFoo: {}
00:00 TRACE: [kryo] Write field: container (GenericFoo) pos=1
00:00 TRACE: [kryo] Optimize ints: true
00:00 TRACE: [kryo] Field 'foos' of type interface java.util.List of generic type java.util.List<GenericFoo<?>>
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
00:00 TRACE: [kryo] Processing generic type java.util.List<GenericFoo<?>>
00:00 TRACE: [kryo] Processing actual type GenericFoo<?> (sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl)
00:00 TRACE: [kryo] Class java.util.List has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=E type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for E is: GenericFoo
00:00 TRACE: [kryo] Generics scope of field 'foos' of class java.util.List<GenericFoo<?>> is {E=class GenericFoo}
00:00 TRACE: [kryo] Determined concrete class of parametrized 'foos' to be java.util.List<GenericFoo<?>> where type parameters are [class GenericFoo]
00:00 TRACE: [kryo] Field generics: [class GenericFoo]
00:00 TRACE: [kryo] Register class name: FooContainer (com.esotericsoftware.kryo.serializers.FieldSerializer)
00:00 TRACE: [kryo] Write class name: FooContainer
00:00 TRACE: [kryo] Write initial object reference 1: FooContainer
00:00 DEBUG: [kryo] Write: FooContainer
00:00 TRACE: [kryo] FieldSerializer.write fields of class: FooContainer
00:00 TRACE: [kryo] Write field: foos (FooContainer) pos=16
00:00 TRACE: [kryo] Register class name: java.util.ArrayList (com.esotericsoftware.kryo.serializers.CollectionSerializer)
00:00 TRACE: [kryo] Write class name: java.util.ArrayList
00:00 TRACE: [kryo] Write initial object reference 2: [GenericFoo@3c679bde, GenericFoo@5d3411d]
00:00 DEBUG: [kryo] Write: [GenericFoo@3c679bde, GenericFoo@5d3411d]
00:00 TRACE: [kryo] Write class name: GenericFoo
00:00 DEBUG: [kryo] Write object reference 0: GenericFoo
00:00 TRACE: [kryo] Class GenericFoo has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=B type bounds=[interface Foo]
00:00 TRACE: [kryo] Trying to use kryo.getGenericScope
00:00 TRACE: [kryo] Settting a new generics scope for class GenericFoo: {}
00:00 TRACE: [kryo] Field container: class FooContainer
00:00 TRACE: [kryo] Field 'foo' of type interface Foo of generic type B
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
00:00 TRACE: [kryo] Generics scope of field 'foo' of class B is null
00:00 TRACE: [kryo] Field 'map' of type interface java.util.Map of generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
00:00 TRACE: [kryo] Processing generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Processing actual type class java.lang.String (java.lang.Class)
00:00 TRACE: [kryo] Processing actual type class java.lang.Object (java.lang.Class)
00:00 TRACE: [kryo] Class java.util.Map has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=K type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for K is: java.lang.String
00:00 TRACE: [kryo] Type parameter variable: name=V type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for V is: java.lang.Object
00:00 TRACE: [kryo] Generics scope of field 'map' of class java.util.Map<java.lang.String, java.lang.Object> is {V=class java.lang.Object, K=class java.lang.String}
00:00 TRACE: [kryo] Determined concrete class of parametrized 'map' to be java.util.Map<java.lang.String, java.lang.Object> where type parameters are [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Field generics: [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Write class name reference 2: GenericFoo
00:00 TRACE: [kryo] Write initial object reference 3: GenericFoo
00:00 DEBUG: [kryo] Write: GenericFoo
00:00 TRACE: [kryo] FieldSerializer.write fields of class: GenericFoo
00:00 TRACE: [kryo] Settting a new generics scope for class GenericFoo: {}
00:00 TRACE: [kryo] Write field: container (GenericFoo) pos=55
00:00 TRACE: [kryo] Write class name reference 0: FooContainer
00:00 DEBUG: [kryo] Write object reference 1: FooContainer
00:00 TRACE: [kryo] Write field: foo (GenericFoo) pos=58
00:00 TRACE: [kryo] Optimize ints: true
00:00 TRACE: [kryo] Register class name: FooRef (com.esotericsoftware.kryo.serializers.FieldSerializer)
00:00 TRACE: [kryo] Write class name: FooRef
00:00 TRACE: [kryo] Write initial object reference 4: FooRef
00:00 DEBUG: [kryo] Write: FooRef
00:00 TRACE: [kryo] FieldSerializer.write fields of class: FooRef
00:00 TRACE: [kryo] Write field: map (GenericFoo) pos=67
00:00 TRACE: [kryo] Register class name: java.util.Collections$SingletonMap (com.esotericsoftware.kryo.serializers.DefaultSerializers$CollectionsSingletonMapSerializer)
00:00 TRACE: [kryo] Write class name: java.util.Collections$SingletonMap
00:00 TRACE: [kryo] Write initial object reference 5: {myself=GenericFoo@5d3411d}
00:00 DEBUG: [kryo] Write: {myself=GenericFoo@5d3411d}
00:00 TRACE: [kryo] Write class 1: String
00:00 TRACE: [kryo] Write initial object reference 6: myself
00:00 TRACE: [kryo] Write: myself
00:00 TRACE: [kryo] Write class name reference 2: GenericFoo
00:00 DEBUG: [kryo] Write object reference 3: GenericFoo
00:00 TRACE: [kryo] Class GenericFoo has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=B type bounds=[interface Foo]
00:00 TRACE: [kryo] Trying to use kryo.getGenericScope
00:00 TRACE: [kryo] Settting a new generics scope for class GenericFoo: {}
00:00 TRACE: [kryo] Field container: class FooContainer
00:00 TRACE: [kryo] Field 'foo' of type interface Foo of generic type B
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
00:00 TRACE: [kryo] Generics scope of field 'foo' of class B is null
00:00 TRACE: [kryo] Field 'map' of type interface java.util.Map of generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
00:00 TRACE: [kryo] Processing generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Processing actual type class java.lang.String (java.lang.Class)
00:00 TRACE: [kryo] Processing actual type class java.lang.Object (java.lang.Class)
00:00 TRACE: [kryo] Class java.util.Map has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=K type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for K is: java.lang.String
00:00 TRACE: [kryo] Type parameter variable: name=V type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for V is: java.lang.Object
00:00 TRACE: [kryo] Generics scope of field 'map' of class java.util.Map<java.lang.String, java.lang.Object> is {V=class java.lang.Object, K=class java.lang.String}
00:00 TRACE: [kryo] Determined concrete class of parametrized 'map' to be java.util.Map<java.lang.String, java.lang.Object> where type parameters are [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Field generics: [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Write field: foo (GenericFoo) pos=115
00:00 TRACE: [kryo] Write class name reference 3: FooRef
00:00 DEBUG: [kryo] Write object reference 4: FooRef
00:00 TRACE: [kryo] Write field: map (GenericFoo) pos=118
00:00 TRACE: [kryo] Write class name reference 4: java.util.Collections$SingletonMap
00:00 TRACE: [kryo] Write initial object reference 7: {myself=GenericFoo@3c679bde}
00:00 DEBUG: [kryo] Write: {myself=GenericFoo@3c679bde}
00:00 TRACE: [kryo] Write class 1: String
00:00 DEBUG: [kryo] Write object reference 6: myself
00:00 TRACE: [kryo] Write class name reference 2: GenericFoo
00:00 DEBUG: [kryo] Write object reference 0: GenericFoo
00:00 TRACE: [kryo] Class GenericFoo has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=B type bounds=[interface Foo]
00:00 TRACE: [kryo] Trying to use kryo.getGenericScope
00:00 TRACE: [kryo] Settting a new generics scope for class GenericFoo: {}
00:00 TRACE: [kryo] Field container: class FooContainer
00:00 TRACE: [kryo] Field 'foo' of type interface Foo of generic type B
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
00:00 TRACE: [kryo] Generics scope of field 'foo' of class B is null
00:00 TRACE: [kryo] Field 'map' of type interface java.util.Map of generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Field generic type is of class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
00:00 TRACE: [kryo] Processing generic type java.util.Map<java.lang.String, java.lang.Object>
00:00 TRACE: [kryo] Processing actual type class java.lang.String (java.lang.Class)
00:00 TRACE: [kryo] Processing actual type class java.lang.Object (java.lang.Class)
00:00 TRACE: [kryo] Class java.util.Map has generic type parameters
00:00 TRACE: [kryo] Type parameter variable: name=K type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for K is: java.lang.String
00:00 TRACE: [kryo] Type parameter variable: name=V type bounds=[class java.lang.Object]
00:00 TRACE: [kryo] Concrete type used for V is: java.lang.Object
00:00 TRACE: [kryo] Generics scope of field 'map' of class java.util.Map<java.lang.String, java.lang.Object> is {V=class java.lang.Object, K=class java.lang.String}
00:00 TRACE: [kryo] Determined concrete class of parametrized 'map' to be java.util.Map<java.lang.String, java.lang.Object> where type parameters are [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Field generics: [class java.lang.String, class java.lang.Object]
00:00 TRACE: [kryo] Object graph complete.
Process finished with exit code 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment