/// <summary>
        /// Сериализовать ссылку.
        /// </summary>
        /// <param name="link">Ссылка.</param>
        /// <returns>Ссылка в виде строки.</returns>
        public string Serialize(ILink link)
        {
            if (link == null)
            {
                return(null);
            }
            var serializer = ModuleProvider?.QueryModule <ILinkSerializer, Type>(link.GetTypeForSerializer());

            if (serializer == null)
            {
                throw new ModuleNotFoundException($"Не найдена логика сериализации для ссылки типа {link.GetTypeForSerializer()?.FullName}");
            }
            return(WithTypeId(serializer.Serialize(link), serializer.LinkTypeId));
        }
        /// <summary>
        /// Десериализовать ссылку.
        /// </summary>
        /// <param name="linkStr">Ссылка в виде строки.</param>
        /// <returns>Ссыока.</returns>
        public ILink Deserialize(string linkStr)
        {
            if (linkStr == null)
            {
                return(null);
            }
            (var data, var typeId) = ExtractTypeId(linkStr);
            var serializer = ModuleProvider?.QueryModule <ILinkSerializer, string>(typeId);

            if (serializer == null)
            {
                throw new ModuleNotFoundException($"Не найдена логика сериализации для ссылки типа \"{typeId}\"");
            }
            return(serializer.Deserialize(data));
        }
 private IObjectSerializer GetSerializer(string typeId)
 {
     if (typeId == null)
     {
         throw new ArgumentNullException(nameof(typeId));
     }
     lock (_idCache)
     {
         if (!_idCache.ContainsKey(typeId))
         {
             _idCache[typeId] = ModuleProvider.QueryModule <IObjectSerializer, string>(typeId)
                                ?? throw new ModuleNotFoundException($"Не найдена логика сериализации типа TypeId=\"{typeId}\"");
         }
         return(_idCache[typeId]);
     }
 }
 private IObjectSerializer GetSerializer(Type type)
 {
     if (type == null)
     {
         throw new ArgumentNullException(nameof(type));
     }
     lock (_typeCache)
     {
         if (!_typeCache.ContainsKey(type))
         {
             _typeCache[type] = ModuleProvider.QueryModule <IObjectSerializer, Type>(type)
                                ?? throw new ModuleNotFoundException($"Не найдена логика сериализации типа {type.FullName}");
         }
         return(_typeCache[type]);
     }
 }