chaokunyang commented on code in PR #1722:
URL: https://github.com/apache/fury/pull/1722#discussion_r1698771062
##########
java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractMapSerializer.java:
##########
@@ -38,188 +39,296 @@
import org.apache.fury.type.TypeUtils;
import org.apache.fury.util.Preconditions;
-/** Serializer for all map-like objects. */
+/**
+ * Serializer for all map-like objects.
+ */
@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class AbstractMapSerializer<T> extends Serializer<T> {
- protected MethodHandle constructor;
- protected final boolean supportCodegenHook;
- private Serializer keySerializer;
- private Serializer valueSerializer;
- protected final ClassInfoHolder keyClassInfoWriteCache;
- protected final ClassInfoHolder keyClassInfoReadCache;
- protected final ClassInfoHolder valueClassInfoWriteCache;
- protected final ClassInfoHolder valueClassInfoReadCache;
- // support map subclass whose key or value generics only are available,
- // or one of types is already instantiated in subclass, ex: `Subclass<T>
implements Map<String,
- // T>`
- private final IdentityMap<GenericType, Tuple2<GenericType, GenericType>>
partialGenericKVTypeMap;
- private final GenericType objType =
fury.getClassResolver().buildGenericType(Object.class);
- // For subclass whose kv type are instantiated already, such as
- // `Subclass implements Map<String, Long>`. If declared `Map` doesn't specify
- // instantiated kv type, then the serialization will need to write those kv
- // types. Although we can extract this generics when creating the serializer,
- // we can't do it when jit `Serializer` for some class which contains one of
such map
- // field. So we will write those extra kv classes to keep protocol
consistency between
- // interpreter and jit mode although it seems unnecessary.
- // With kv header in future, we can write this kv classes only once, the
cost won't be too much.
- private int numElements;
-
- public AbstractMapSerializer(Fury fury, Class<T> cls) {
- this(fury, cls, !ReflectionUtils.isDynamicGeneratedCLass(cls));
- }
-
- public AbstractMapSerializer(Fury fury, Class<T> cls, boolean
supportCodegenHook) {
- super(fury, cls);
- this.supportCodegenHook = supportCodegenHook;
- keyClassInfoWriteCache = fury.getClassResolver().nilClassInfoHolder();
- keyClassInfoReadCache = fury.getClassResolver().nilClassInfoHolder();
- valueClassInfoWriteCache = fury.getClassResolver().nilClassInfoHolder();
- valueClassInfoReadCache = fury.getClassResolver().nilClassInfoHolder();
- partialGenericKVTypeMap = new IdentityMap<>();
- }
-
- /**
- * Set key serializer for next serialization, the <code>serializer</code>
will be cleared when
- * next serialization finished.
- */
- public void setKeySerializer(Serializer keySerializer) {
- this.keySerializer = keySerializer;
- }
-
- /**
- * Set value serializer for next serialization, the <code>serializer</code>
will be cleared when
- * next serialization finished.
- */
- public void setValueSerializer(Serializer valueSerializer) {
- this.valueSerializer = valueSerializer;
- }
-
- @Override
- public void write(MemoryBuffer buffer, T value) {
- Map map = onMapWrite(buffer, value);
- writeElements(fury, buffer, map);
- }
-
- @Override
- public void xwrite(MemoryBuffer buffer, T value) {
- Map map = onMapWrite(buffer, value);
- xwriteElements(fury, buffer, map);
- }
-
- protected final void writeElements(Fury fury, MemoryBuffer buffer, Map map) {
- Serializer keySerializer = this.keySerializer;
- Serializer valueSerializer = this.valueSerializer;
- // clear the elemSerializer to avoid conflict if the nested
- // serialization has collection field.
- // TODO use generics for compatible serializer.
- this.keySerializer = null;
- this.valueSerializer = null;
- if (keySerializer != null && valueSerializer != null) {
- javaWriteWithKVSerializers(fury, buffer, map, keySerializer,
valueSerializer);
- } else if (keySerializer != null) {
- javaWriteWithKeySerializers(map, buffer, keySerializer);
- } else if (valueSerializer != null) {
- javaWriteWithValueSerializers(map, buffer, valueSerializer);
- } else {
- genericJavaWrite(fury, buffer, map);
- }
- }
-
- private void javaWriteWithKeySerializers(Map map, MemoryBuffer buffer,
Serializer keySerializer) {
- MapChunkWriter mapChunkWriter = new MapChunkWriter(fury);
- ClassResolver classResolver = fury.getClassResolver();
- RefResolver refResolver = fury.getRefResolver();
- for (Object object : map.entrySet()) {
- Map.Entry entry = (Map.Entry) object;
- mapChunkWriter = mapChunkWriter.next(entry.getKey(),
entry.getValue(), buffer);
- mapChunkWriter.writeFinalKey(entry.getKey(), buffer, keySerializer);
- Object value = entry.getValue();
- mapChunkWriter.writeValue(value, buffer, classResolver, refResolver,
fury.trackingRef(), valueClassInfoWriteCache);
- mapChunkWriter.increaseChunkSize();
- }
- mapChunkWriter.writeHeader(buffer);
- }
-
- private void javaWriteWithValueSerializers(Map map, MemoryBuffer buffer,
Serializer valueSerializer) {
- MapChunkWriter mapChunkWriter = new MapChunkWriter(fury);
- ClassResolver classResolver = fury.getClassResolver();
- RefResolver refResolver = fury.getRefResolver();
- for (Object object : map.entrySet()) {
- Map.Entry entry = (Map.Entry) object;
- Object key = entry.getKey();
- mapChunkWriter = mapChunkWriter.next(entry.getKey(),
entry.getValue(), buffer);
- mapChunkWriter.writeKey(key, buffer, classResolver, refResolver,
fury.trackingRef(), keyClassInfoWriteCache);
- mapChunkWriter.writeFinalValue(entry.getValue(), buffer,
valueSerializer);
- mapChunkWriter.increaseChunkSize();
- }
- mapChunkWriter.writeHeader(buffer);
- }
-
- private void javaWriteWithKVSerializers(
- Fury fury,
- MemoryBuffer buffer,
- Map map,
- Serializer keySerializer,
- Serializer valueSerializer) {
- MapChunkWriter mapChunkWriter = new MapChunkWriter(fury);
- for (Object object : map.entrySet()) {
- Map.Entry entry = (Map.Entry) object;
- Object key = entry.getKey();
- Object value = entry.getValue();
- mapChunkWriter = mapChunkWriter.next(entry.getKey(), entry.getValue(),
buffer);
- mapChunkWriter.writeFinalKey(key, buffer, keySerializer);
- mapChunkWriter.writeFinalValue(value, buffer, valueSerializer);
- mapChunkWriter.increaseChunkSize();
- }
- mapChunkWriter.writeHeader(buffer);
- }
-
- private void genericJavaWrite(Fury fury, MemoryBuffer buffer, Map map) {
- Generics generics = fury.getGenerics();
- GenericType genericType = generics.nextGenericType();
- if (genericType == null) {
- generalJavaChunkWrite(fury, buffer, map);
- } else {
- GenericType keyGenericType = genericType.getTypeParameter0();
- GenericType valueGenericType = genericType.getTypeParameter1();
- // type parameters count for `Map field` will be 0;
- // type parameters count for `SubMap<V> field` which SubMap is
- // `SubMap<V> implements Map<String, V>` will be 1;
- if (genericType.getTypeParametersCount() < 2) {
- Tuple2<GenericType, GenericType> kvGenericType =
getKVGenericType(genericType);
- if (keyGenericType == objType && valueGenericType == objType) {
- generalJavaChunkWrite(fury, buffer, map);
- return;
- }
- keyGenericType = kvGenericType.f0;
- valueGenericType = kvGenericType.f1;
- }
- // Can't avoid push generics repeatedly in loop by stack depth, because
push two
- // generic type changed generics stack top, which is depth index, update
stack top
- // and depth will have some cost too.
- // Stack depth to avoid push generics repeatedly in loop.
- // Note push two generic type changed generics stack top, which is depth
index,
- // stack top should be updated when using for serialization k/v.
- // int depth = fury.getDepth();
- // // depth + 1 to leave a slot for value generics, otherwise value
generics will
- // // be overwritten by nested key generics.
- // fury.setDepth(depth + 1);
- // generics.pushGenericType(keyGenericType);
- // fury.setDepth(depth);
- // generics.pushGenericType(valueGenericType);
- boolean keyGenericTypeFinal = keyGenericType.isMonomorphic();
- boolean valueGenericTypeFinal = valueGenericType.isMonomorphic();
- if (keyGenericTypeFinal && valueGenericTypeFinal) {
- javaKVTypesFinalChunkWrite(fury, buffer, map, keyGenericType,
valueGenericType, generics);
- } else if (keyGenericTypeFinal) {
- javaKeyTypeFinalChunkWrite(fury, buffer, map, keyGenericType,
valueGenericType, generics);
- } else if (valueGenericTypeFinal) {
- javaValueTypeFinalChunkWrite(fury, buffer, map, keyGenericType,
valueGenericType, generics);
- } else {
- javaKVTypesNonFinalChunkWrite(fury, buffer, map, keyGenericType,
valueGenericType, generics);
- }
- }
- }
+ protected MethodHandle constructor;
Review Comment:
Yes, spotless needs jdk11 now
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]