Skip to content

[Java] something wrong when skipping nonexistent named_ext #2684

@urlyy

Description

@urlyy

Search before asking

  • I had searched in the issues and found no similar issues.

Version

Latest

Component(s)

Java

Minimal reproduce step

private static class ComplexObject1Serializer extends Serializer<ComplexObject1> {
  public ComplexObject1Serializer(Fory fory, Class<ComplexObject1> cls) {
      super(fory, cls);
  }

  @Override
  public void write(MemoryBuffer buffer, ComplexObject1 value) {
      xwrite(buffer, value);
  }

  @Override
  public ComplexObject1 read(MemoryBuffer buffer) {
      return xread(buffer);
  }

  @Override
  public void xwrite(MemoryBuffer buffer, ComplexObject1 value) {
      fory.xwriteRef(buffer, value.f2);
  }

  @SuppressWarnings("unchecked")
  @Override
  public ComplexObject1 xread(MemoryBuffer buffer) {
      ComplexObject1 obj = new ComplexObject1();
      obj.f2 = (String) fory.xreadRef(buffer);
      return obj;
  }
}

public static class ComplexObject1 {
  String f2;
  public ComplexObject1() {
      this.f2 = "hello";
  }
}

public static class Outer {
  ComplexObject1 f1;
  public Outer(ComplexObject1 f1) {
      this.f1 = f1;
  }
}

public static class Outer2 { }

@Test
public void testRegisterSerializer() throws Exception {
  Fory fory =
          Fory.builder()
                  .withLanguage(Language.XLANG)
                  .withCompatibleMode(CompatibleMode.COMPATIBLE)
                  .requireClassRegistration(false)
                  .build();
  Fory fory2 =
          Fory.builder()
                  .withLanguage(Language.XLANG)
                  .withCompatibleMode(CompatibleMode.COMPATIBLE)
                  .requireClassRegistration(false)
                  .build();
  fory.register(ComplexObject1.class, "test.ComplexObject1");
  fory.registerSerializer(ComplexObject1.class, ComplexObject1Serializer.class);
  fory.register(Outer.class, "test.outer");
  Outer outer = new Outer(new ComplexObject1());
  byte[] serialized = fory.serialize(outer);

  fory2.register(Outer2.class, "test.outer");
  Outer2 outer2 = (Outer2) fory2.deserialize(serialized);
  System.out.println(outer2);
}

What did you expect to see?

pass test

What did you see instead?


org.apache.fory.exception.DeserializationException: Failed to deserialize input

	at org.apache.fory.util.ExceptionUtils.handleReadFailed(ExceptionUtils.java:66)
	at org.apache.fory.Fory.deserialize(Fory.java:886)
	at org.apache.fory.Fory.deserialize(Fory.java:782)
	at org.apache.fory.RustXlangTest.testRegisterSerializer(RustXlangTest.java:170)
	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.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:136)
	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:658)
	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:219)
	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:923)
	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:192)
	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
	at java.util.ArrayList.forEach(ArrayList.java:1259)
	at org.testng.TestRunner.privateRun(TestRunner.java:808)
	at org.testng.TestRunner.run(TestRunner.java:603)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
	at org.testng.TestNG.runSuites(TestNG.java:1092)
	at org.testng.TestNG.run(TestNG.java:1060)
	at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:65)
	at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:105)
Caused by: java.lang.NullPointerException
	at org.apache.fory.serializer.NonexistentClassSerializers$NonexistentClassSerializer.getClassFieldsInfo(NonexistentClassSerializers.java:161)
	at org.apache.fory.serializer.NonexistentClassSerializers$NonexistentClassSerializer.read(NonexistentClassSerializers.java:197)
	at org.apache.fory.serializer.NonexistentClassSerializers$NonexistentClassSerializer.xread(NonexistentClassSerializers.java:239)
	at org.apache.fory.RustXlangTest_Outer2ForyCodecMetaShared0_0.xread(RustXlangTest_Outer2ForyCodecMetaShared0_0.java:48)
	at org.apache.fory.Fory.xreadNonRef(Fory.java:1118)
	at org.apache.fory.Fory.xreadRef(Fory.java:1053)
	at org.apache.fory.Fory.deserialize(Fory.java:880)
	... 29 more

Anything Else?

No response

Are you willing to submit a PR?

  • I'm willing to submit a PR!

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions