w-yfan opened a new issue, #2070: URL: https://github.com/apache/fury/issues/2070
### Search before asking - [x] I had searched in the [issues](https://github.com/apache/fury/issues) and found no similar issues. ### Version fury:0.9.0 jdk: 8 & 11 ### Component(s) Java ### Minimal reproduce step @Data @AllArgsConstructor static class Pojo { private String str; } @Test public void testSerializationUsingJdk11() { // run with jdk11 Fury fury = Fury.builder() .withLanguage(Language.JAVA) .withRefTracking(false) .withCompatibleMode(CompatibleMode.SCHEMA_CONSISTENT) .withAsyncCompilation(true) .build(); fury.register(Pojo.class); byte[] bytes = fury.serialize(new Pojo("test")); writeBytesToFile("example.bytes", bytes); } @SneakyThrows @Test public void testDeserializeUsingJdk8() { // run with jdk8 Fury fury = Fury.builder() .withLanguage(Language.JAVA) .withRefTracking(false) .withCompatibleMode(CompatibleMode.SCHEMA_CONSISTENT) .withAsyncCompilation(true) .build(); fury.register(Pojo.class); byte[] bytes = readBytesFromFile("example.bytes"); System.out.println(fury.deserialize(bytes)); } public static byte[] readBytesFromFile(String filePath) throws IOException { try (FileInputStream fis = new FileInputStream(filePath)) { byte[] data = new byte[fis.available()]; int read = fis.read(data); return data; } catch (IOException e) { throw new IOException("Error reading file: " + e.getMessage()); } } public static void writeBytesToFile(String filePath, byte[] data) { try (FileOutputStream fos = new FileOutputStream(filePath)) { fos.write(data); } catch (IOException e) { System.out.println("Error writing to file: " + e.getMessage()); } } ### What did you expect to see? Complete the deserialization process correctly. ### What did you see instead? The method org.apache.fury.serializer.ObjectSerializer.read() is not used. The stack trace is as follows: java.lang.IndexOutOfBoundsException: readerIndex(8) + length(6) exceeds size(10): org.apache.fury.memory.MemoryBuffer$BoundChecker@12405818 at org.apache.fury.memory.MemoryBuffer$BoundChecker.fillBuffer(MemoryBuffer.java:186) at org.apache.fury.memory.MemoryBuffer.readInt64(MemoryBuffer.java:1431) at org.apache.fury.resolver.MetaStringResolver.readBigMetaStringBytes(MetaStringResolver.java:199) at org.apache.fury.resolver.MetaStringResolver.readMetaStringBytesWithFlag(MetaStringResolver.java:159) at org.apache.fury.resolver.ClassResolver.readClassInfoFromBytes(ClassResolver.java:1732) at org.apache.fury.resolver.ClassResolver.readClassInfo(ClassResolver.java:1666) at org.apache.fury.Fury.readRef(Fury.java:861) at org.apache.fury.serializer.collection.GuavaCollectionSerializers$ImmutableSortedMapSerializer.newMap(GuavaCollectionSerializers.java:377) at org.apache.fury.serializer.collection.MapSerializer.read(MapSerializer.java:67) at org.apache.fury.serializer.collection.MapSerializer.read(MapSerializer.java:27) at org.apache.fury.Fury.readDataInternal(Fury.java:959) at org.apache.fury.Fury.readRef(Fury.java:861) at org.apache.fury.Fury.deserialize(Fury.java:793) at org.apache.fury.Fury.deserialize(Fury.java:714) at com.micar.tsp.realdata.JdkTest.testDeserializeUsingJdk8(JdkTest.java:54) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ### Anything Else? Both ImmutableCollectionSerializers and SubListSerializers register java.util.ImmutableCollections$SubList, but JDK 8 does not have java.util.ImmutableCollections$SubList, resulting in JDK 8 registering two placeholders. In JDK 11, although java.util.ImmutableCollections$SubList is registered twice, "If a serializer exists before, it will be replaced by the new serializer." This causes the ClassResolver.ExtRegistry#classIdGenerator in JDK 11 to have one less entry compared to JDK 8. The final result: when JDK 8 and JDK 11 are used together, the correct serializers cannot be retrieved through classIdGenerator. ### Are you willing to submit a PR? - [x] I'm willing to submit a PR! -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
