encode method
Converts value to JSON-compatible values with tagged extensions.
Implementation
Object? encode(Object? value) {
if (value == null || value is bool || value is num || value is String) {
if (value is double && !value.isFinite) {
throw ArgumentError('Cannot serialize a non-finite double.');
}
return value;
}
for (final adapter in _adapters) {
if (adapter.canEncode(value)) {
return <String, Object?>{
r'$type': adapter.tag,
r'$value': encode(adapter.encode(value, this)),
};
}
}
if (value is List) return value.map(encode).toList(growable: false);
if (value is Iterable) return value.map(encode).toList(growable: false);
if (value is Map) {
if (value.keys.any((key) => key is! String)) {
throw ArgumentError('Serialized maps require String keys.');
}
final encoded = value.map<String, Object?>(
(key, item) => MapEntry(key as String, encode(item)),
);
if (encoded.containsKey(r'$type') && encoded.containsKey(r'$value')) {
return <String, Object?>{
r'$type': 'Map',
r'$value': encoded.entries
.map<Object?>((entry) => <Object?>[entry.key, entry.value])
.toList(growable: false),
};
}
return encoded;
}
throw ArgumentError.value(
value,
'value',
'Register a SerializationAdapter for this type.',
);
}