Skip to content

Commit

Permalink
optimize scala collection class register
Browse files Browse the repository at this point in the history
  • Loading branch information
chaokunyang committed Sep 24, 2024
1 parent 22193f6 commit 911fb7a
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package org.apache.fury.serializer.scala;

import org.apache.fury.Fury;
import org.apache.fury.resolver.ClassResolver;
import org.apache.fury.serializer.Serializer;
import org.apache.fury.serializer.SerializerFactory;

public class ScalaSerializers {

public static void registerSerializers(Fury fury) {
ClassResolver resolver = setSerializerFactory(fury);
resolver.register(scala.collection.immutable.Nil$.class);
resolver.register(scala.collection.immutable.List$.class);
resolver.register(scala.collection.immutable.$colon$colon.class);
resolver.register(scala.collection.immutable.Set.Set1.class);
resolver.register(scala.collection.immutable.Set.Set2.class);
resolver.register(scala.collection.immutable.Set.Set3.class);
resolver.register(scala.collection.immutable.Set.Set4.class);
resolver.register(scala.collection.immutable.Map$.class);
resolver.register(scala.collection.immutable.Map.Map1.class);
resolver.register(scala.collection.immutable.Map.Map2.class);
resolver.register(scala.collection.immutable.Map.Map3.class);
resolver.register(scala.collection.immutable.Map.Map4.class);
resolver.register("scala.collection.immutable.Map$EmptyMap$");
resolver.register("scala.collection.IterableFactory$ToFactory");
resolver.register("scala.collection.MapFactory$ToFactory");
resolver.register(scala.collection.generic.SerializeEnd$.class);
resolver.register(scala.collection.generic.DefaultSerializationProxy.class);
resolver.register(scala.runtime.ModuleSerializationProxy.class);
}

private static ClassResolver setSerializerFactory(Fury fury) {
ClassResolver resolver = fury.getClassResolver();
ScalaDispatcher dispatcher = new ScalaDispatcher();
SerializerFactory factory = resolver.getSerializerFactory();
if (factory != null) {
SerializerFactory newFactory = (f, cls) -> {
Serializer serializer = factory.createSerializer(f, cls);
if (serializer == null) {
serializer = dispatcher.createSerializer(f, cls);
}
return serializer;
};
resolver.setSerializerFactory(newFactory);
} else {
resolver.setSerializerFactory(dispatcher);
}
return resolver;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ class CollectionSerializerTest extends AnyWordSpec with Matchers {
.withLanguage(Language.JAVA)
.withRefTracking(true)
.withScalaOptimizationEnabled(setOpt)
.requireClassRegistration(false).build()
.requireClassRegistration(false)
.suppressClassRegistrationWarnings(false)
.build()
ScalaSerializers.registerSerializers(fury1)
if (setFactory) {
fury1.getClassResolver.setSerializerFactory(new ScalaDispatcher())
}
Expand All @@ -43,6 +46,8 @@ class CollectionSerializerTest extends AnyWordSpec with Matchers {
"serialize/deserialize List" in {
val list = List(100, 10000L)
fury1.deserialize(fury1.serialize(list)) shouldEqual list
val list2 = List(100, 10000L, 10000L, 10000L)
fury1.deserialize(fury1.serialize(list2)) shouldEqual list2
}
"serialize/deserialize empty List" in {
fury1.deserialize(fury1.serialize(List.empty)) shouldEqual List.empty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class CompatibleSingleObjectSerializerTest extends AnyWordSpec with Matchers {
.requireClassRegistration(false)
.withRefTracking(true)
.withCompatibleMode(CompatibleMode.COMPATIBLE)
.suppressClassRegistrationWarnings(false)
.build()
}

Expand All @@ -59,10 +60,10 @@ class CompatibleSingleObjectSerializerTest extends AnyWordSpec with Matchers {
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
val o = SingletonObject.ArraySeqQuery(ArraySeq(SingletonObject.Query))
fury.deserialize(
fury.serialize(
o)) shouldEqual o
}
"testArrayQuery" in {
val o = SingletonObject.ArrayQuery(Array(SingletonObject.Query))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class ScalaTest extends AnyWordSpec with Matchers {
.withLanguage(Language.JAVA)
.withRefTracking(true)
.withScalaOptimizationEnabled(true)
.requireClassRegistration(false).build()
.requireClassRegistration(false).suppressClassRegistrationWarnings(false).build()

val p = SomePackageObject.SomeClass(1)
fury.deserialize(fury.serialize(p)) shouldEqual p
Expand All @@ -61,7 +61,7 @@ object PkgObjectMain extends App {
.builder()
.withScalaOptimizationEnabled(true)
.requireClassRegistration(false)
.withRefTracking(true)
.withRefTracking(true).suppressClassRegistrationWarnings(false)
.build()

import PkgObject._
Expand All @@ -81,6 +81,7 @@ object PkgObjectMain2 extends App {
.withScalaOptimizationEnabled(true)
.requireClassRegistration(false)
.withRefTracking(true)
.suppressClassRegistrationWarnings(false)
.build()

import PkgObject._
Expand Down

0 comments on commit 911fb7a

Please sign in to comment.