using System.Globalization; using DPumpHydr.WinFrmUI.WenSkin.Json.Utilities; namespace DPumpHydr.WinFrmUI.WenSkin.Json.Serialization { internal class DefaultReferenceResolver : IReferenceResolver { private int _referenceCount; private BidirectionalDictionary GetMappings(object context) { JsonSerializerInternalBase jsonSerializerInternalBase; if (context is JsonSerializerInternalBase) { jsonSerializerInternalBase = (JsonSerializerInternalBase)context; } else { if (!(context is JsonSerializerProxy)) { throw new JsonException("The DefaultReferenceResolver can only be used internally."); } jsonSerializerInternalBase = ((JsonSerializerProxy)context).GetInternalSerializer(); } return jsonSerializerInternalBase.DefaultReferenceMappings; } public object ResolveReference(object context, string reference) { GetMappings(context).TryGetByFirst(reference, out var second); return second; } public string GetReference(object context, object value) { BidirectionalDictionary mappings = GetMappings(context); if (!mappings.TryGetBySecond(value, out var first)) { _referenceCount++; first = _referenceCount.ToString(CultureInfo.InvariantCulture); mappings.Set(first, value); } return first; } public void AddReference(object context, string reference, object value) { GetMappings(context).Set(reference, value); } public bool IsReferenced(object context, object value) { string first; return GetMappings(context).TryGetBySecond(value, out first); } } }