/// <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);
            }
        }