Last active
February 19, 2021 07:41
-
-
Save hierynomus/a2f143a555466f83d9bc to your computer and use it in GitHub Desktop.
Kryo 2.24.0 / 3.0.3 StackOverflowError with generics
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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