diff --git a/java/fury-core/src/main/java/org/apache/fury/meta/Encoders.java b/java/fury-core/src/main/java/org/apache/fury/meta/Encoders.java index 1143422160..a1b1f4c211 100644 --- a/java/fury-core/src/main/java/org/apache/fury/meta/Encoders.java +++ b/java/fury-core/src/main/java/org/apache/fury/meta/Encoders.java @@ -36,8 +36,10 @@ /** A class used to encode package/class/field name. */ public class Encoders { - public static final MetaStringEncoder PACKAGE_ENCODER = new MetaStringEncoder('.', '_'); - public static final MetaStringDecoder PACKAGE_DECODER = new MetaStringDecoder('.', '_'); + public static final MetaStringEncoder GENERIC_ENCODER = new MetaStringEncoder('.', '_'); + public static final MetaStringDecoder GENERIC_DECODER = new MetaStringDecoder('.', '_'); + public static final MetaStringEncoder PACKAGE_ENCODER = GENERIC_ENCODER; + public static final MetaStringDecoder PACKAGE_DECODER = GENERIC_DECODER; public static final MetaStringEncoder TYPE_NAME_ENCODER = new MetaStringEncoder('$', '_'); public static final MetaStringDecoder TYPE_NAME_DECODER = new MetaStringDecoder('$', '_'); public static final String ARRAY_PREFIX = "1"; diff --git a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassInfo.java b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassInfo.java index b5aac59353..562343c7de 100644 --- a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassInfo.java +++ b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassInfo.java @@ -19,8 +19,8 @@ package org.apache.fury.resolver; +import static org.apache.fury.meta.Encoders.GENERIC_ENCODER; import static org.apache.fury.meta.Encoders.PACKAGE_ENCODER; -import static org.apache.fury.meta.Encoders.TYPE_NAME_ENCODER; import org.apache.fury.collection.Tuple2; import org.apache.fury.config.Language; @@ -82,18 +82,23 @@ public class ClassInfo { if (cls != null && classResolver.getFury().getLanguage() != Language.JAVA) { this.fullClassNameBytes = metaStringResolver.getOrCreateMetaStringBytes( - PACKAGE_ENCODER.encode(cls.getName(), Encoding.UTF_8)); + GENERIC_ENCODER.encode(cls.getName(), Encoding.UTF_8)); } else { this.fullClassNameBytes = null; } + // When `classId == ClassResolver.REPLACE_STUB_ID` was established, + // means only classes are serialized, not the instance. If we + // serialize such class only, we need to write classname bytes. if (cls != null - && (classId == ClassResolver.NO_CLASS_ID || classId == ClassResolver.REPLACE_STUB_ID)) { + && ((classId == ClassResolver.NO_CLASS_ID + && !classResolver.getFury().getConfig().isMetaShareEnabled()) + || classId == ClassResolver.REPLACE_STUB_ID)) { // REPLACE_STUB_ID for write replace class in `ClassSerializer`. Tuple2 tuple2 = Encoders.encodePkgAndClass(cls); this.packageNameBytes = - metaStringResolver.getOrCreateMetaStringBytes(PACKAGE_ENCODER.encode(tuple2.f0)); + metaStringResolver.getOrCreateMetaStringBytes(Encoders.encodePackage(tuple2.f0)); this.classNameBytes = - metaStringResolver.getOrCreateMetaStringBytes(TYPE_NAME_ENCODER.encode(tuple2.f1)); + metaStringResolver.getOrCreateMetaStringBytes(Encoders.encodeTypeName(tuple2.f1)); } else { this.packageNameBytes = null; this.classNameBytes = null; 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 4fce1cced0..58ea84aadb 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 @@ -1701,7 +1701,7 @@ public Class xreadClass(MemoryBuffer buffer) { Class cls = classNameBytes2Class.get(byteString); if (cls == null) { Preconditions.checkNotNull(byteString); - String className = byteString.decode('.', '_'); + String className = byteString.decode(Encoders.GENERIC_DECODER); cls = loadClass(className); classNameBytes2Class.put(byteString, cls); } diff --git a/java/fury-core/src/main/java/org/apache/fury/resolver/MetaStringResolver.java b/java/fury-core/src/main/java/org/apache/fury/resolver/MetaStringResolver.java index bf8665d3a4..30ede25229 100644 --- a/java/fury-core/src/main/java/org/apache/fury/resolver/MetaStringResolver.java +++ b/java/fury-core/src/main/java/org/apache/fury/resolver/MetaStringResolver.java @@ -22,6 +22,7 @@ import org.apache.fury.collection.LongMap; import org.apache.fury.collection.ObjectMap; import org.apache.fury.memory.MemoryBuffer; +import org.apache.fury.meta.Encoders; import org.apache.fury.meta.MetaString; /** @@ -109,7 +110,7 @@ public String readMetaString(MemoryBuffer buffer) { String str = metaStringBytes2StringMap.get(byteString); if (str == null) { // TODO support meta string in other languages. - str = byteString.decode('.', '_'); + str = byteString.decode(Encoders.GENERIC_DECODER); metaStringBytes2StringMap.put(byteString, str); } return str; diff --git a/java/fury-core/src/test/java/org/apache/fury/resolver/ClassInfoTest.java b/java/fury-core/src/test/java/org/apache/fury/resolver/ClassInfoTest.java new file mode 100644 index 0000000000..0d60c9bc79 --- /dev/null +++ b/java/fury-core/src/test/java/org/apache/fury/resolver/ClassInfoTest.java @@ -0,0 +1,46 @@ +/* + * 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.resolver; + +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; + +import org.apache.fury.Fury; +import org.apache.fury.config.Language; +import org.testng.annotations.Test; + +public class ClassInfoTest { + @Test + public void testEncodePackageNameAndTypeName() { + Fury fury = + Fury.builder() + .withLanguage(Language.JAVA) + .requireClassRegistration(false) + .withMetaShare(true) + .build(); + ClassInfo info = fury.getClassResolver().getClassInfo(org.apache.fury.test.bean.Foo.class); + assertNull(info.packageNameBytes); + + Fury fury1 = Fury.builder().withLanguage(Language.JAVA).requireClassRegistration(false).build(); + ClassInfo info1 = fury1.getClassResolver().getClassInfo(org.apache.fury.test.bean.Foo.class); + assertNotNull(info1.packageNameBytes); + assertNotNull(info1.classNameBytes); + } +}