PreserveReferenceResolver
using System.Collections.Generic;
namespace System.Text.Json.Serialization
{
internal sealed class PreserveReferenceResolver : ReferenceResolver
{
private uint _referenceCount;
private readonly Dictionary<string, object> _referenceIdToObjectMap;
private readonly Dictionary<object, string> _objectToReferenceIdMap;
public PreserveReferenceResolver(bool writing)
{
if (writing)
_objectToReferenceIdMap = new Dictionary<object, string>(System.Collections.Generic.ReferenceEqualityComparer.Instance);
else
_referenceIdToObjectMap = new Dictionary<string, object>();
}
public override void AddReference(string referenceId, object value)
{
if (!JsonHelpers.TryAdd(_referenceIdToObjectMap, referenceId, value))
ThrowHelper.ThrowJsonException_MetadataDuplicateIdFound(referenceId);
}
public override string GetReference(object value, out bool alreadyExists)
{
if (_objectToReferenceIdMap.TryGetValue(value, out string value2))
alreadyExists = true;
else {
_referenceCount++;
value2 = _referenceCount.ToString();
_objectToReferenceIdMap.Add(value, value2);
alreadyExists = false;
}
return value2;
}
public override object ResolveReference(string referenceId)
{
if (!_referenceIdToObjectMap.TryGetValue(referenceId, out object value))
ThrowHelper.ThrowJsonException_MetadataReferenceNotFound(referenceId);
return value;
}
}
}