public static AbstractSharedMessage FromJson(string typeShortName, string data)
        {
            Type GetTypeForDeserialization()
            {
                if (cacheTypes.TryGetValue(typeShortName, out var type))
                {
                    return(type);
                }
                var allImplementations = ReflectionTools.FindAllImplementations(typeof(AbstractSharedMessage));

                foreach (var candidate in allImplementations)
                {
                    if (candidate.Name == typeShortName)
                    {
                        type = candidate;
                    }
                    cacheTypes[candidate.Name] = type;
                }

                return(type);
            }

            return((AbstractSharedMessage)JsonConvert.DeserializeObject(data, GetTypeForDeserialization()));
        }