in java/fury-core/src/main/java/org/apache/fury/builder/BaseObjectCodecBuilder.java [1450:1498]
protected Expression deserializeForNotNull(
Expression buffer, TypeRef<?> typeRef, Expression serializer, InvokeHint invokeHint) {
Class<?> cls = getRawType(typeRef);
if (isPrimitive(cls) || isBoxed(cls)) {
// for primitive, inline call here to avoid java boxing, rather call corresponding serializer.
if (cls == byte.class || cls == Byte.class) {
return new Invoke(buffer, "readByte", PRIMITIVE_BYTE_TYPE);
} else if (cls == boolean.class || cls == Boolean.class) {
return new Invoke(buffer, "readBoolean", PRIMITIVE_BOOLEAN_TYPE);
} else if (cls == char.class || cls == Character.class) {
return readChar(buffer);
} else if (cls == short.class || cls == Short.class) {
return readInt16(buffer);
} else if (cls == int.class || cls == Integer.class) {
return fury.compressInt() ? readVarInt32(buffer) : readInt32(buffer);
} else if (cls == long.class || cls == Long.class) {
return LongSerializer.readInt64(buffer, fury.longEncoding());
} else if (cls == float.class || cls == Float.class) {
return readFloat32(buffer);
} else if (cls == double.class || cls == Double.class) {
return readFloat64(buffer);
} else {
throw new IllegalStateException("impossible");
}
} else {
if (cls == String.class) {
return fury.getStringSerializer().readStringExpr(stringSerializerRef, buffer);
}
Expression obj;
if (useCollectionSerialization(typeRef)) {
obj = deserializeForCollection(buffer, typeRef, serializer, invokeHint);
} else if (useMapSerialization(typeRef)) {
obj = deserializeForMap(buffer, typeRef, serializer, invokeHint);
} else {
if (serializer != null) {
return new Invoke(serializer, "read", OBJECT_TYPE, buffer);
}
if (isMonomorphic(cls)) {
serializer = getOrCreateSerializer(cls);
Class<?> returnType =
ReflectionUtils.getReturnType(getRawType(serializer.type()), "read");
obj = new Invoke(serializer, "read", TypeRef.of(returnType), buffer);
} else {
obj = readForNotNullNonFinal(buffer, typeRef, serializer);
}
}
return obj;
}
}