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]