serialize method
String?
serialize(
- DartType targetType,
- String expression,
- TypeHelperContextWithConfig context
override
Returns Dart code that serializes an expression representing a Dart
object of type targetType.
If targetType is not supported, returns null.
Let's say you want to serialize a class Foo as just its id property
of type int.
Treating expression as a opaque Dart expression, the serialize
implementation could be a simple as:
String serialize(DartType targetType, String expression) =>
"$expression.id";
```.
Implementation
@override
String? serialize(
DartType targetType,
String expression,
TypeHelperContextWithConfig context,
) {
if (!coreMapTypeChecker.isAssignableFromType(targetType)) {
return null;
}
final args = targetType.typeArgumentsOf(coreMapTypeChecker)!;
assert(args.length == 2);
final keyType = args[0];
final valueType = args[1];
_checkSafeKeyType(expression, keyType);
final subFieldValue = context.serialize(valueType, closureArg);
final customKeyConverter = const JsonConverterHelper(
forMapKey: true,
).serialize(keyType, keyParam, context);
var subKeyValue =
customKeyConverter ??
_forType(
keyType,
dateTimeUtc: context.config.dateTimeUtc,
)?.serialize(keyType, keyParam, false) ??
context.serialize(keyType, keyParam);
if (customKeyConverter == null &&
keyType.isEnum &&
(enumEncodedValues(keyType)?.any((v) => v is int) ?? false)) {
subKeyValue = '$subKeyValue.toString()';
}
if (closureArg == subFieldValue && keyParam == subKeyValue) {
return expression;
}
final optionalQuestion = targetType.isNullableType ? '?' : '';
return '$expression$optionalQuestion'
'.map(($keyParam, $closureArg) => '
'MapEntry($subKeyValue, $subFieldValue))';
}