This is an automated email from the ASF dual-hosted git repository.

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fury.git


The following commit(s) were added to refs/heads/main by this push:
     new 8d5f8f3d fix(java): Fix replace resolver serializaiton (#1812)
8d5f8f3d is described below

commit 8d5f8f3da1e8217edcdc448ab83ff7b7efe6b073
Author: Shawn Yang <[email protected]>
AuthorDate: Wed Aug 21 20:21:06 2024 +0800

    fix(java): Fix replace resolver serializaiton (#1812)
    
    ## What does this PR do?
    
    <!-- Describe the purpose of this PR. -->
    
    ## Related issues
    
    Closes #1805
    Closes #1804
    
    
    ## Does this PR introduce any user-facing change?
    
    <!--
    If any user-facing interface changes, please [open an
    issue](https://github.com/apache/fury/issues/new/choose) describing the
    need to do so and update the document if necessary.
    -->
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    ## Benchmark
    
    <!--
    When the PR has an impact on performance (if you don't know whether the
    PR will have an impact on performance, you can submit the PR first, and
    if it will have impact on performance, the code reviewer will explain
    it), be sure to attach a benchmark data here.
    -->
---
 .../fury/exception/DeserializationException.java   | 13 ++++-
 .../main/java/org/apache/fury/meta/ClassDef.java   |  4 +-
 .../org/apache/fury/resolver/ClassResolver.java    |  4 ++
 .../fury/serializer/ReplaceResolveSerializer.java  |  2 +-
 scala/build.sbt                                    |  1 +
 .../{ => scala}/CollectionSerializerTest.scala     |  3 +-
 .../CompatibleSingleObjectSerializerTest.scala}    | 58 +++++++++++++---------
 .../fury/serializer/{ => scala}/ScalaTest.scala    |  2 +-
 .../{ => scala}/SingleObjectSerializerTest.scala   |  2 +-
 .../fury/serializer/{ => scala}/TupleTest.scala    |  2 +-
 10 files changed, 59 insertions(+), 32 deletions(-)

diff --git 
a/java/fury-core/src/main/java/org/apache/fury/exception/DeserializationException.java
 
b/java/fury-core/src/main/java/org/apache/fury/exception/DeserializationException.java
index 11d9691a..562d18b0 100644
--- 
a/java/fury-core/src/main/java/org/apache/fury/exception/DeserializationException.java
+++ 
b/java/fury-core/src/main/java/org/apache/fury/exception/DeserializationException.java
@@ -48,7 +48,18 @@ public class DeserializationException extends FuryException {
     if (readObjects == null) {
       return super.getMessage();
     } else {
-      return "Deserialize failed, read objects are: " + readObjects;
+      try {
+        return "Deserialize failed, read objects are: " + readObjects;
+      } catch (Throwable e) {
+        StringBuilder builder =
+            new StringBuilder("Deserialize failed, type of read objects are: 
[");
+        for (Object readObject : readObjects) {
+          builder.append(readObject == null ? null : 
readObject.getClass()).append(", ");
+        }
+        builder.delete(builder.length() - 2, 2);
+        builder.append("]");
+        return builder.toString();
+      }
     }
   }
 }
diff --git a/java/fury-core/src/main/java/org/apache/fury/meta/ClassDef.java 
b/java/fury-core/src/main/java/org/apache/fury/meta/ClassDef.java
index 35fb467d..1b6177e0 100644
--- a/java/fury-core/src/main/java/org/apache/fury/meta/ClassDef.java
+++ b/java/fury-core/src/main/java/org/apache/fury/meta/ClassDef.java
@@ -23,6 +23,7 @@ import static 
org.apache.fury.meta.ClassDefEncoder.buildFields;
 import static org.apache.fury.type.TypeUtils.COLLECTION_TYPE;
 import static org.apache.fury.type.TypeUtils.MAP_TYPE;
 import static org.apache.fury.type.TypeUtils.collectionOf;
+import static org.apache.fury.type.TypeUtils.getArrayComponent;
 import static org.apache.fury.type.TypeUtils.mapOf;
 
 import java.io.ObjectStreamClass;
@@ -242,7 +243,8 @@ public class ClassDef implements Serializable {
           if (rawType.isEnum()
               || rawType.isAssignableFrom(descriptor.getRawType())
               || NonexistentClass.isNonexistent(rawType)
-              || rawType.isAssignableFrom(FinalObjectTypeStub.class)) {
+              || rawType == FinalObjectTypeStub.class
+              || (rawType.isArray() && getArrayComponent(rawType) == 
FinalObjectTypeStub.class)) {
             descriptor = descriptor.copyWithTypeName(newDesc.getTypeName());
             descriptors.add(descriptor);
           } else {
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java 
b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java
index 186a60df..3160850c 100644
--- a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java
+++ b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java
@@ -1560,6 +1560,10 @@ public class ClassResolver {
       classInfo = new ClassInfo(this, cls, null, null, classId == null ? 
NO_CLASS_ID : classId);
       classInfoMap.put(cls, classInfo);
     }
+    writeClassInternal(buffer, classInfo);
+  }
+
+  public void writeClassInternal(MemoryBuffer buffer, ClassInfo classInfo) {
     short classId = classInfo.classId;
     if (classId == REPLACE_STUB_ID) {
       // clear class id to avoid replaced class written as
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/serializer/ReplaceResolveSerializer.java
 
b/java/fury-core/src/main/java/org/apache/fury/serializer/ReplaceResolveSerializer.java
index dfac24d8..e958669e 100644
--- 
a/java/fury-core/src/main/java/org/apache/fury/serializer/ReplaceResolveSerializer.java
+++ 
b/java/fury-core/src/main/java/org/apache/fury/serializer/ReplaceResolveSerializer.java
@@ -268,7 +268,7 @@ public class ReplaceResolveSerializer extends 
AbstractObjectSerializer {
   }
 
   private void writeObject(MemoryBuffer buffer, Object value, MethodInfoCache 
jdkMethodInfoCache) {
-    classResolver.writeClass(buffer, writeClassInfo);
+    classResolver.writeClassInternal(buffer, writeClassInfo);
     jdkMethodInfoCache.objectSerializer.write(buffer, value);
   }
 
diff --git a/scala/build.sbt b/scala/build.sbt
index 92a5c6b6..1addf1df 100644
--- a/scala/build.sbt
+++ b/scala/build.sbt
@@ -45,4 +45,5 @@ resolvers += Resolver.ApacheMavenSnapshotsRepo
 libraryDependencies ++= Seq(
   "org.apache.fury" % "fury-core" % furyVersion,
   "org.scalatest" %% "scalatest" % "3.2.19" % Test,
+  "dev.zio" %% "zio" % "2.1.7" % Test,
 )
diff --git 
a/scala/src/test/scala/org/apache/fury/serializer/CollectionSerializerTest.scala
 
b/scala/src/test/scala/org/apache/fury/serializer/scala/CollectionSerializerTest.scala
similarity index 97%
rename from 
scala/src/test/scala/org/apache/fury/serializer/CollectionSerializerTest.scala
rename to 
scala/src/test/scala/org/apache/fury/serializer/scala/CollectionSerializerTest.scala
index 772f60b4..b86662ad 100644
--- 
a/scala/src/test/scala/org/apache/fury/serializer/CollectionSerializerTest.scala
+++ 
b/scala/src/test/scala/org/apache/fury/serializer/scala/CollectionSerializerTest.scala
@@ -17,11 +17,10 @@
  * under the License.
  */
 
-package org.apache.fury.serializer
+package org.apache.fury.serializer.scala
 
 import org.apache.fury.Fury
 import org.apache.fury.config.Language
-import org.apache.fury.serializer.scala.ScalaDispatcher
 import org.scalatest.matchers.should.Matchers
 import org.scalatest.wordspec.AnyWordSpec
 
diff --git 
a/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
 
b/scala/src/test/scala/org/apache/fury/serializer/scala/CompatibleSingleObjectSerializerTest.scala
similarity index 54%
copy from 
scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
copy to 
scala/src/test/scala/org/apache/fury/serializer/scala/CompatibleSingleObjectSerializerTest.scala
index 5d7901e1..1b8afc85 100644
--- 
a/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
+++ 
b/scala/src/test/scala/org/apache/fury/serializer/scala/CompatibleSingleObjectSerializerTest.scala
@@ -17,50 +17,60 @@
  * under the License.
  */
 
-package org.apache.fury.serializer
+package org.apache.fury.serializer.scala
 
 import org.apache.fury.Fury
-import org.apache.fury.config.Language
+import org.apache.fury.config.CompatibleMode
 import org.scalatest.matchers.should.Matchers
 import org.scalatest.wordspec.AnyWordSpec
+import zio.Chunk
 
-object singleton {}
+import scala.collection.immutable.ArraySeq
 
-case class Pair(f1: Any, f2: Any)
+object SingletonObject {
+  case object Query
 
-object A {
-  object B {
-    case class C(value: String) {
-    }
-  }
+  case class ArraySeqQuery(c: ArraySeq[Query.type])
+
+  case class ArrayQuery(c: Array[Query.type])
+
+  case class CaseChunk(c: Chunk[Int])
 }
 
-class X {
-  class Y {
-    class Z
+class CompatibleSingleObjectSerializerTest extends AnyWordSpec with Matchers {
+  def fury: Fury = {
+    org.apache.fury.Fury
+      .builder()
+      .withScalaOptimizationEnabled(true)
+      .requireClassRegistration(false)
+      .withRefTracking(true)
+      .withCompatibleMode(CompatibleMode.COMPATIBLE)
+      .build()
   }
-}
 
-class SingleObjectSerializerTest extends AnyWordSpec with Matchers {
   "fury scala object support" should {
     "serialize/deserialize" in {
-      val fury = Fury.builder()
-        .withLanguage(Language.JAVA)
-        .withRefTracking(true)
-        .withScalaOptimizationEnabled(true)
-        .requireClassRegistration(false).build()
       fury.deserialize(fury.serialize(singleton)) shouldBe singleton
       fury.deserialize(fury.serialize(Pair(singleton, singleton))) shouldEqual 
Pair(singleton, singleton)
     }
     "nested type serialization in object type" in {
-      val fury = Fury.builder()
-        .withLanguage(Language.JAVA)
-        .withRefTracking(true)
-        .withScalaOptimizationEnabled(true)
-        .requireClassRegistration(false).build()
       val x = A.B.C("hello, world!")
       val bytes = fury.serialize(x)
       fury.deserialize(bytes) shouldEqual A.B.C("hello, world!")
     }
+    "testArraySeqQuery" in {
+      val o =  SingletonObject.ArraySeqQuery(ArraySeq(SingletonObject.Query))
+        fury.deserialize(
+          fury.serialize(
+           o)) shouldEqual o
+    }
+    "testArrayQuery" in {
+      val o = SingletonObject.ArrayQuery(Array(SingletonObject.Query))
+      fury.deserialize(fury.serialize(o)).getClass shouldEqual o.getClass
+    }
+    "testCaseChunk" in {
+      val o = SingletonObject.CaseChunk(Chunk(1))
+      fury.deserialize(fury.serialize(o)) shouldEqual o
+    }
   }
 }
diff --git a/scala/src/test/scala/org/apache/fury/serializer/ScalaTest.scala 
b/scala/src/test/scala/org/apache/fury/serializer/scala/ScalaTest.scala
similarity index 98%
rename from scala/src/test/scala/org/apache/fury/serializer/ScalaTest.scala
rename to scala/src/test/scala/org/apache/fury/serializer/scala/ScalaTest.scala
index b91f3929..9a391dce 100644
--- a/scala/src/test/scala/org/apache/fury/serializer/ScalaTest.scala
+++ b/scala/src/test/scala/org/apache/fury/serializer/scala/ScalaTest.scala
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.fury.serializer
+package org.apache.fury.serializer.scala
 
 import org.apache.fury.Fury
 import org.apache.fury.config.Language
diff --git 
a/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
 
b/scala/src/test/scala/org/apache/fury/serializer/scala/SingleObjectSerializerTest.scala
similarity index 98%
rename from 
scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
rename to 
scala/src/test/scala/org/apache/fury/serializer/scala/SingleObjectSerializerTest.scala
index 5d7901e1..9976f679 100644
--- 
a/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
+++ 
b/scala/src/test/scala/org/apache/fury/serializer/scala/SingleObjectSerializerTest.scala
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.fury.serializer
+package org.apache.fury.serializer.scala
 
 import org.apache.fury.Fury
 import org.apache.fury.config.Language
diff --git a/scala/src/test/scala/org/apache/fury/serializer/TupleTest.scala 
b/scala/src/test/scala/org/apache/fury/serializer/scala/TupleTest.scala
similarity index 98%
rename from scala/src/test/scala/org/apache/fury/serializer/TupleTest.scala
rename to scala/src/test/scala/org/apache/fury/serializer/scala/TupleTest.scala
index be129206..a02931f1 100644
--- a/scala/src/test/scala/org/apache/fury/serializer/TupleTest.scala
+++ b/scala/src/test/scala/org/apache/fury/serializer/scala/TupleTest.scala
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.fury.serializer
+package org.apache.fury.serializer.scala
 
 import org.apache.fury.Fury
 import org.apache.fury.config.Language


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to