Skip to content

[Java] Class with missing field failed to deserialize on new version #1972

Closed
@orisgarno

Description

@orisgarno

Search before asking

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

Version

java v0.9.0

Component(s)

Java

Minimal reproduce step

BaseFury s = FuryFury.builder()
.withLanguage(Language.JAVA)
.withRefTracking(true)
.withIntCompressed(true)
.withLongCompressed(true)
.withStringCompressed(true)
.withCompatibleMode(CompatibleMode.COMPATIBLE)
.requireClassRegistration(false)
.withAsyncCompilation(true)
.serializeEnumByName(true)
.buildThreadSafeFury()
public class PrivateFliedClassNumberOne {
  private boolean privateBoolean = true;
  private int privateInt = 10;
  private String privateString = "notNull";
  private Map<String, String> privateMap = Map.of("a", "b");
  private List<String> privateList = List.of("l");
  private PrivateFieldSubClass privateFieldSubClass = new PrivateFieldSubClass();
}
public class PrivateFliedClassNumberTwoWithMissingField {

  private Map<String, String> privateMap = Map.of("a", "b");
  private int privateInt = 10;
  private PrivateFieldSubClass privateFieldSubClass = new PrivateFieldSubClass();
  private List<String> privateList = List.of("l");
  private boolean privateBoolean = true;
}

code to repro

    PrivateFliedClassNumberOne privateField = new PrivateFliedClassNumberOne();
    byte[] serialized = s.serializeJavaObject(privateField);


    PrivateFliedClassNumberTwoWithMissingField privateField2 = s.deserializeJavaObject(
        serialized, 
        PrivateFliedClassNumberTwoWithMissingField.class
    );

What did you expect to see?

Should be able to deserialize successfully

What did you see instead?

exception

Deserialize failed, read objects are: [PrivateFliedClassNumberTwoWithMissingField{privateMap={a=b}, privateInt=10, privateFieldSubClass=true, privateList=[l], privateBoolean=true}]

	at org.apache.fury.util.ExceptionUtils.handleReadFailed(ExceptionUtils.java:63)
	at org.apache.fury.Fury.deserializeJavaObject(Fury.java:1124)
	at org.apache.fury.Fury.deserializeJavaObject(Fury.java:1101)
	at org.apache.fury.ThreadLocalFury.deserializeJavaObject(ThreadLocalFury.java:202)
	at serde.SerdeTestBase.testBasicPrivateField_diffClassScrambledField(SerdeTestBase.java:89)
	at serde.SerdeTestBase.runAll(SerdeTestBase.java:35)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
	at org.testng.TestRunner.privateRun(TestRunner.java:756)
	at org.testng.TestRunner.run(TestRunner.java:610)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
	at org.testng.SuiteRunner.run(SuiteRunner.java:289)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)
	at org.testng.TestNG.runSuites(TestNG.java:1133)
	at org.testng.TestNG.run(TestNG.java:1104)
	at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:65)
	at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:105)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 111 out of bounds for length 6
	at org.apache.fury.collection.ObjectArray.set(ObjectArray.java:58)
	at org.apache.fury.resolver.MapRefResolver.setReadObject(MapRefResolver.java:209)
	at org.apache.fury.Fury.readRef(Fury.java:875)
	at org.apache.fury.serializer.ObjectSerializer.readContainerFieldValue(ObjectSerializer.java:385)
	at org.apache.fury.serializer.ObjectSerializer.readAndSetFields(ObjectSerializer.java:318)
	at org.apache.fury.serializer.ObjectSerializer.read(ObjectSerializer.java:246)
	at org.apache.fury.Fury.readDataInternal(Fury.java:959)
	at org.apache.fury.Fury.deserializeJavaObject(Fury.java:1118)
	... 30 more

Anything Else?

this is the first time i encounter this issue.
i was using fury v0.5.1 and doesnt have this kind of problem. i am also tried to repro this on 0.5.1, but its not happening on that version.

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