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/incubator-fury.git
The following commit(s) were added to refs/heads/main by this push:
new 7d912ca1 fix(java): clear serializer for collection/map (#1606)
7d912ca1 is described below
commit 7d912ca161d7e8f75176ce4d25fdcf2aac61a74a
Author: Shawn Yang <[email protected]>
AuthorDate: Mon May 6 22:54:33 2024 +0800
fix(java): clear serializer for collection/map (#1606)
## What does this PR do?
Some collectionSerializer may overwrite write/read method, then clear
element serializer may not got invoked.
This PR clears serializer for collection/map to avoid container use
wrong serializer for nested elements.
## Related issues
#1558
https://github.com/apache/incubator-fury/issues/1455,
https://github.com/apache/incubator-fury/issues/1325 and
https://github.com/apache/incubator-fury/issues/1176.
## Does this PR introduce any user-facing change?
<!--
If any user-facing interface changes, please [open an
issue](https://github.com/apache/incubator-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.
-->
---
.../org/apache/fury/resolver/FieldResolver.java | 91 +++++++++++++++++-----
.../fury/serializer/CompatibleSerializer.java | 43 +++++++---
2 files changed, 107 insertions(+), 27 deletions(-)
diff --git
a/java/fury-core/src/main/java/org/apache/fury/resolver/FieldResolver.java
b/java/fury-core/src/main/java/org/apache/fury/resolver/FieldResolver.java
index b7651179..047a2af1 100644
--- a/java/fury-core/src/main/java/org/apache/fury/resolver/FieldResolver.java
+++ b/java/fury-core/src/main/java/org/apache/fury/resolver/FieldResolver.java
@@ -568,29 +568,54 @@ public class FieldResolver {
ClassInfo elementClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo classInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
CollectionSerializer collectionSerializer = (CollectionSerializer)
classInfo.getSerializer();
-
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
- o = collectionSerializer.read(buffer);
+ try {
+
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
+ o = collectionSerializer.read(buffer);
+ } finally {
+ // Some collectionSerializer may overwrite write/read method, then
clear element serializer
+ // may not got invoked.
+ collectionSerializer.setElementSerializer(null);
+ }
} else if (fieldType == FieldTypes.MAP_KV_FINAL) {
ClassInfo keyClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo valueClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo classInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
- mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
- mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
- o = mapSerializer.read(buffer);
+ try {
+ mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+ mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+ o = mapSerializer.read(buffer);
+ } finally {
+ // Some mmapSerializer may overwrite write/read method, then clear
serializer
+ // may not got invoked.
+ mapSerializer.setKeySerializer(null);
+ mapSerializer.setValueSerializer(null);
+ }
} else if (fieldType == FieldTypes.MAP_KEY_FINAL) {
ClassInfo keyClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo classInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
- mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
- o = mapSerializer.read(buffer);
+ try {
+ mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+ o = mapSerializer.read(buffer);
+ } finally {
+ // Some mmapSerializer may overwrite write/read method, then clear
serializer
+ // may not got invoked.
+ mapSerializer.setKeySerializer(null);
+ }
} else {
Preconditions.checkArgument(fieldType == FieldTypes.MAP_VALUE_FINAL);
ClassInfo valueClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo classInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
- mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
- o = mapSerializer.read(buffer);
+ try {
+ mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+ o = mapSerializer.read(buffer);
+ } finally {
+ // Some mmapSerializer may overwrite write/read method, then clear
serializer
+ // may not got invoked.
+ mapSerializer.setValueSerializer(null);
+ }
}
return o;
}
@@ -601,29 +626,54 @@ public class FieldResolver {
ClassInfo elementClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo classInfo = classResolver.readClassInfo(buffer,
fieldInfo.getClassInfoHolder());
CollectionSerializer collectionSerializer = (CollectionSerializer)
classInfo.getSerializer();
-
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
- o = collectionSerializer.read(buffer);
+ try {
+
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
+ o = collectionSerializer.read(buffer);
+ // Some collectionSerializer may overwrite write/read method, then
clear element serializer
+ // may not got invoked.
+ } finally {
+ collectionSerializer.setElementSerializer(null);
+ }
} else if (fieldType == FieldTypes.MAP_KV_FINAL) {
ClassInfo keyClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo valueClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo classInfo = classResolver.readClassInfo(buffer,
fieldInfo.getClassInfoHolder());
MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
- mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
- mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
- o = mapSerializer.read(buffer);
+ try {
+ mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+ mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+ o = mapSerializer.read(buffer);
+ } finally {
+ // Some mmapSerializer may overwrite write/read method, then clear
serializer
+ // may not got invoked.
+ mapSerializer.setKeySerializer(null);
+ mapSerializer.setValueSerializer(null);
+ }
} else if (fieldType == FieldTypes.MAP_KEY_FINAL) {
ClassInfo keyClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo classInfo = classResolver.readClassInfo(buffer,
fieldInfo.getClassInfoHolder());
MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
- mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
- o = mapSerializer.read(buffer);
+ try {
+ mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+ o = mapSerializer.read(buffer);
+ // Some mmapSerializer may overwrite write/read method, then clear
serializer
+ // may not got invoked.
+ } finally {
+ mapSerializer.setKeySerializer(null);
+ }
} else {
Preconditions.checkArgument(fieldType == FieldTypes.MAP_VALUE_FINAL);
ClassInfo valueClassInfo = classResolver.readClassInfo(buffer,
classInfoHolder);
ClassInfo classInfo = classResolver.readClassInfo(buffer,
fieldInfo.getClassInfoHolder());
MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
- mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
- o = mapSerializer.read(buffer);
+ try {
+ mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+ o = mapSerializer.read(buffer);
+ // Some mmapSerializer may overwrite write/read method, then clear
serializer
+ // may not got invoked.
+ } finally {
+ mapSerializer.setValueSerializer(null);
+ }
}
return o;
}
@@ -969,4 +1019,9 @@ public class FieldResolver {
return valueType;
}
}
+
+ public static void main(String[] args) {
+ System.out.println(computeStringHash("list0") << 2);
+ System.out.println(computeStringHash("serializeListLast") << 2);
+ }
}
diff --git
a/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
b/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
index c143ce2e..b48e8993 100644
---
a/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
+++
b/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
@@ -242,8 +242,14 @@ public final class CompatibleSerializer<T> extends
CompatibleSerializerBase<T> {
ClassInfo classInfo = fieldInfo.getClassInfo(fieldValue.getClass());
classResolver.writeClass(buffer, classInfo);
CollectionSerializer collectionSerializer = (CollectionSerializer)
classInfo.getSerializer();
-
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
- collectionSerializer.write(buffer, fieldValue);
+ try {
+
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
+ collectionSerializer.write(buffer, fieldValue);
+ } finally {
+ // Some collectionSerializer may overwrite write/read method, then clear
element serializer
+ // may not got invoked.
+ collectionSerializer.setElementSerializer(null);
+ }
}
private void writeMapKVFinal(
@@ -256,9 +262,16 @@ public final class CompatibleSerializer<T> extends
CompatibleSerializerBase<T> {
ClassInfo classInfo = fieldInfo.getClassInfo(fieldValue.getClass());
classResolver.writeClass(buffer, classInfo);
MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
- mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
- mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
- mapSerializer.write(buffer, fieldValue);
+ try {
+ mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+ mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+ mapSerializer.write(buffer, fieldValue);
+ } finally {
+ // Some mmapSerializer may overwrite write/read method, then clear
serializer
+ // may not got invoked.
+ mapSerializer.setKeySerializer(null);
+ mapSerializer.setValueSerializer(null);
+ }
}
private void writeMapKeyFinal(
@@ -269,8 +282,14 @@ public final class CompatibleSerializer<T> extends
CompatibleSerializerBase<T> {
ClassInfo classInfo = fieldInfo.getClassInfo(fieldValue.getClass());
classResolver.writeClass(buffer, classInfo);
MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
- mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
- mapSerializer.write(buffer, fieldValue);
+ try {
+ mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+ mapSerializer.write(buffer, fieldValue);
+ } finally {
+ // Some mmapSerializer may overwrite write/read method, then clear
serializer
+ // may not got invoked.
+ mapSerializer.setKeySerializer(null);
+ }
}
private void writeMapValueFinal(
@@ -281,8 +300,14 @@ public final class CompatibleSerializer<T> extends
CompatibleSerializerBase<T> {
ClassInfo classInfo = fieldInfo.getClassInfo(fieldValue.getClass());
classResolver.writeClass(buffer, classInfo);
MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
- mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
- mapSerializer.write(buffer, fieldValue);
+ try {
+ mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+ mapSerializer.write(buffer, fieldValue);
+ } finally {
+ // Some mmapSerializer may overwrite write/read method, then clear
serializer
+ // may not got invoked.
+ mapSerializer.setValueSerializer(null);
+ }
}
@SuppressWarnings("unchecked")
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]