protected virtual TExtensibleTypeProperties DeserializeTypeProperties(
            string typeName,
            string json,
            out Type type)
        {
            TExtensibleTypeProperties typeProperties;

            if (this.TryGetRegisteredType(typeName, out type))
            {
                if (string.IsNullOrEmpty(json))
                {
                    // No typeProperties exist to deserialize, just initialize a default instance
                    typeProperties = (TExtensibleTypeProperties)Activator.CreateInstance(type);
                }
                else
                {
                    typeProperties = (TExtensibleTypeProperties)TypeProperties.DeserializeObject(json, type);
                }
            }
            else
            {
                Dictionary <string, JToken> serviceExtraProperties =
                    JsonConvert.DeserializeObject <Dictionary <string, JToken> >(
                        json,
                        ConversionCommon.DefaultSerializerSettings);

                typeProperties = new TGenericTypeProperties()
                {
                    ServiceExtraProperties = serviceExtraProperties
                };
                type = typeof(TGenericTypeProperties);
            }

            return(typeProperties);
        }