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]

Reply via email to