in java/fury-format/src/main/java/org/apache/fury/format/encoder/BaseBinaryEncoderBuilder.java [138:223]
protected Expression serializeFor(
Expression ordinal,
Expression inputObject,
Expression writer,
TypeRef<?> typeRef,
Expression arrowField) {
Class<?> rawType = getRawType(typeRef);
if (TypeUtils.isPrimitive(rawType)) {
return new ListExpression(
// notNull is by default, no need to call setNotNullAt
new Invoke(writer, "write", ordinal, inputObject));
} else if (TypeUtils.isBoxed(rawType)) {
// janino support autoboxing and unboxing, so we don't need to call intValue/longValue....
return setValueOrNull(writer, ordinal, inputObject, inputObject);
} else if (rawType == BigDecimal.class) {
return setValueOrNull(writer, ordinal, inputObject, inputObject);
} else if (rawType == java.math.BigInteger.class) {
Invoke value = new Invoke(inputObject, "toByteArray", TypeRef.of(byte[].class));
return setValueOrNull(writer, ordinal, inputObject, value);
} else if (rawType == java.time.LocalDate.class) {
StaticInvoke value =
new StaticInvoke(
DateTimeUtils.class,
"localDateToDays",
TypeUtils.PRIMITIVE_INT_TYPE,
false,
inputObject);
return setValueOrNull(writer, ordinal, inputObject, value);
} else if (rawType == java.sql.Date.class) {
StaticInvoke value =
new StaticInvoke(
DateTimeUtils.class,
"fromJavaDate",
TypeUtils.PRIMITIVE_INT_TYPE,
false,
inputObject);
return setValueOrNull(writer, ordinal, inputObject, value);
} else if (rawType == java.sql.Timestamp.class) {
StaticInvoke value =
new StaticInvoke(
DateTimeUtils.class,
"fromJavaTimestamp",
TypeUtils.PRIMITIVE_LONG_TYPE,
false,
inputObject);
return setValueOrNull(writer, ordinal, inputObject, value);
} else if (rawType == java.time.Instant.class) {
StaticInvoke value =
new StaticInvoke(
DateTimeUtils.class,
"instantToMicros",
TypeUtils.PRIMITIVE_LONG_TYPE,
false,
inputObject);
return setValueOrNull(writer, ordinal, inputObject, value);
} else if (rawType == String.class) {
return setValueOrNull(writer, ordinal, inputObject, inputObject);
} else if (rawType.isEnum()) {
Invoke value = new Invoke(inputObject, "name", TypeUtils.STRING_TYPE);
return setValueOrNull(writer, ordinal, inputObject, value);
} else if (rawType.isArray() || TypeUtils.ITERABLE_TYPE.isSupertypeOf(typeRef)) {
// place outer writer operations here, because map key/value arrays need to call
// serializeForArray,
// but don't setOffsetAndSize for array.
Invoke offset =
new Invoke(writer, "writerIndex", "writerIndex", TypeUtils.PRIMITIVE_INT_TYPE);
Expression serializeArray = serializeForArray(inputObject, writer, typeRef, arrowField);
Arithmetic size =
ExpressionUtils.subtract(
new Invoke(writer, "writerIndex", "writerIndex", TypeUtils.PRIMITIVE_INT_TYPE),
offset);
Invoke setOffsetAndSize = new Invoke(writer, "setOffsetAndSize", ordinal, offset, size);
ListExpression expression =
new ListExpression(offset, serializeArray, size, setOffsetAndSize);
return new If(
ExpressionUtils.eqNull(inputObject),
new Invoke(writer, "setNullAt", ordinal),
expression);
} else if (TypeUtils.MAP_TYPE.isSupertypeOf(typeRef)) {
return serializeForMap(ordinal, writer, inputObject, typeRef, arrowField);
} else if (TypeUtils.isBean(rawType)) {
return serializeForBean(ordinal, writer, inputObject, typeRef, arrowField);
} else {
return serializeForObject(ordinal, writer, inputObject);
}
}