/// <inheritdoc /> public override void DataField <TTarget, TSource>( ref TTarget value, string name, TTarget defaultValue, ReadConvertFunc <TTarget, TSource> ReadConvertFunc, WriteConvertFunc <TTarget, TSource>?WriteConvertFunc = null, bool alwaysWrite = false) { if (Reading) { foreach (var map in ReadMaps !) { if (map.TryGetNode(name, out var node)) { value = ReadConvertFunc((TSource)NodeToType(typeof(TSource), node)); return; } } value = defaultValue; } else { if (WriteConvertFunc == null) { // TODO: More verbosity diagnostics. Logger.WarningS(LogCategory, "Field '{0}' not written due to lack of WriteConvertFunc.", name); return; } // don't write if value is null or default if (!alwaysWrite && IsValueDefault(name, value, defaultValue, WithFormat <TTarget> .NoFormat)) { return; } var key = name; var val = value == null?TypeToNode(WriteConvertFunc(defaultValue !)) : TypeToNode(WriteConvertFunc(value !)); // write the concrete type tag AssignTag(typeof(TTarget), value, defaultValue, val); WriteMap !.Add(key, val); } }