Beispiel #1
0
        private bool TryPerformUncachedTypeResolution(string fullName, out Type type, Assembly[] assemblies)
        {
            if (null == assemblies)
            {
                throw new ArgumentNullException(nameof(assemblies));
            }
            if (string.IsNullOrWhiteSpace(fullName))
            {
                throw new ArgumentException("A type name must not be null nor consist of only whitespace.", nameof(fullName));
            }

            if (TryResolveFromAllAssemblies(fullName, out type, assemblies))
            {
                return(true);
            }

            type = Type.GetType(fullName, false) ?? Type.GetType(
                fullName,
                ResolveAssembly,
                ResolveType,
                false);
            return(type != null);

            Assembly ResolveAssembly(AssemblyName assemblyName)
            {
                var fullAssemblyName = assemblyName.FullName;

                if (_assemblyCache.TryGetValue(fullAssemblyName, out var result))
                {
                    return(result);
                }

                foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    var name = assembly.GetName();

                    _assemblyCache[name.FullName] = assembly;
                    _assemblyCache[name.Name]     = assembly;
                }

                return(_assemblyCache.TryGetValue(fullAssemblyName, out result) ? result : null);
            }

            Type ResolveType(Assembly asm, string name, bool ignoreCase)
            {
                if (TryResolveFromAllAssemblies(name, out var result, assemblies))
                {
                    return(result);
                }

                return(asm?.GetType(name, false, ignoreCase) ??
                       Type.GetType(name, false, ignoreCase));
            }
        }
        private ValueSerializer GetCustomDeserializer([NotNull] Type type)
        {
            //do we already have a deserializer for this type?
            if (_deserializers.TryGetValue(type, out ValueSerializer serializer))
            {
                return(serializer);
            }

            //is there a deserializer factory that can handle this type?
            foreach (var valueSerializerFactory in Options.ValueSerializerFactories)
            {
                if (valueSerializerFactory.CanDeserialize(this, type))
                {
                    return(valueSerializerFactory.BuildSerializer(this, type, _deserializers));
                }
            }

            //none of the above, lets create a POCO object deserializer
            serializer = new ObjectSerializer(type);
            //add it to the serializer lookup in case of recursive serialization
            if (!_deserializers.TryAdd(type, serializer))
            {
                return(_deserializers[type]);
            }
            //build the serializer IL code
            CodeGenerator.BuildSerializer(this, (ObjectSerializer)serializer);
            return(serializer);
        }
        /// <summary>
        /// Returns a <see cref="string"/> form of <paramref name="type"/> which can be parsed by <see cref="Type.GetType(string)"/>.
        /// </summary>
        /// <param name="type">The type to format.</param>
        /// <returns>
        /// A <see cref="string"/> form of <paramref name="type"/> which can be parsed by <see cref="Type.GetType(string)"/>.
        /// </returns>
        public static string Format(TypeInfo type)
        {
            if (type is null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (!Cache.TryGetValue(type, out var result))
            {
Beispiel #4
0
        /// <summary>
        /// Returns a <see cref="string"/> form of <paramref name="type"/> which can be parsed by <see cref="Type.GetType(string)"/>.
        /// </summary>
        /// <param name="type">The type to format.</param>
        /// <returns>
        /// A <see cref="string"/> form of <paramref name="type"/> which can be parsed by <see cref="Type.GetType(string)"/>.
        /// </returns>
        public static string Format(TypeInfo type)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (!Cache.TryGetValue(type, out var result))
            {
                string FormatType(Type t)
                {
                    var builder = new StringBuilder();

                    Format(builder, t.GetTypeInfo(), isElementType: false);
                    return(builder.ToString());
                }

                result = Cache.GetOrAdd(type, FormatType);
            }

            return(result);
        }
Beispiel #5
0
        private bool TryPerformUncachedTypeResolution(string fullName, out Type type, IEnumerable <Assembly> assemblies)
        {
            if (null == assemblies)
            {
                throw new ArgumentNullException(nameof(assemblies));
            }

            if (string.IsNullOrWhiteSpace(fullName))
            {
                throw new ArgumentException("A type name must not be null nor consist of only whitespace.", nameof(fullName));
            }

            foreach (var assembly in assemblies)
            {
                type = assembly.GetType(fullName, false);
                if (type != null)
                {
                    return(true);
                }
            }

            type = Type.GetType(fullName, throwOnError: false);
            if (type is null)
            {
                type = Type.GetType(
                    fullName,
                    ResolveAssembly,
                    ResolveType,
                    false);
            }

            return(type != null);

            Assembly ResolveAssembly(AssemblyName assemblyName)
            {
                var fullAssemblyName = assemblyName.FullName;

                if (_assemblyCache.TryGetValue(fullAssemblyName, out var result))
                {
                    return(result);
                }

                foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    var name = assembly.GetName();
                    _assemblyCache[name.FullName] = assembly;
                    _assemblyCache[name.Name]     = assembly;
                }

                if (_assemblyCache.TryGetValue(fullAssemblyName, out result))
                {
                    return(result);
                }

                result = Assembly.Load(assemblyName);
                var resultName = result.GetName();

                _assemblyCache[resultName.Name]     = result;
                _assemblyCache[resultName.FullName] = result;

                return(result);
            }
        public ValueSerializer GetSerializerByType([NotNull] Type type)
        {
            //do we already have a serializer for this type?
            if (_serializers.TryGetValue(type, out ValueSerializer serializer))
            {
                return(serializer);
            }

            //is there a serializer factory that can handle this type?
            foreach (var valueSerializerFactory in Options.ValueSerializerFactories)
            {
                if (valueSerializerFactory.CanSerialize(this, type))
                {
                    return(valueSerializerFactory.BuildSerializer(this, type, _serializers));
                }
            }

            //none of the above, lets create a POCO object serializer
            serializer = new ObjectSerializer(type);
            if (Options.KnownTypesDict.TryGetValue(type, out ushort index))
            {
                var wrapper = new KnownTypeObjectSerializer((ObjectSerializer)serializer, index);
                if (!_serializers.TryAdd(type, wrapper))
                {
                    return(_serializers[type]);
                }



                try
                {
                    //build the serializer IL code
                    CodeGenerator.BuildSerializer(this, (ObjectSerializer)serializer);
                }
                catch (Exception exp)
                {
                    var invalidSerializer = new UnsupportedTypeSerializer(type, exp.Message);
                    _serializers[type] = invalidSerializer;
                    return(invalidSerializer);
                }
                //just ignore if this fails, another thread have already added an identical serializer
                return(wrapper);
            }
            if (!_serializers.TryAdd(type, serializer))
            {
                return(_serializers[type]);
            }



            try
            {
                //build the serializer IL code
                CodeGenerator.BuildSerializer(this, (ObjectSerializer)serializer);
            }
            catch (Exception exp)
            {
                var invalidSerializer = new UnsupportedTypeSerializer(type, exp.Message);
                _serializers[type] = invalidSerializer;
                return(invalidSerializer);
            }


            //just ignore if this fails, another thread have already added an identical serializer
            return(serializer);
            //add it to the serializer lookup in case of recursive serialization
        }