Example #1
0
        /// <inheritdoc/>
        public virtual bool Deserialize(IParser reader, Type expectedType, Func <IParser, Type, object> nestedObjectDeserializer, out object value)
        {
            value = null;
            if (!reader.Accept(out MappingStart mapping))
            {
                return(false);
            }
            if (expectedType.IsInterface ||
                !expectedType.IsAbstract ||
                !expectedType.TryGetCustomAttribute(out DiscriminatorAttribute discriminatorAttribute))
            {
                return(this.Inner.Deserialize(reader, expectedType, nestedObjectDeserializer, out value));
            }
            if (!this.Resolvers.TryGetValue(expectedType, out AbstractTypeResolver resolver))
            {
                resolver = new AbstractTypeResolver(expectedType);
                this.Resolvers.Add(expectedType, resolver);
            }
            ParsingEventStream stream = ParsingEventStream.Create(reader);

            if (!resolver.TryResolve(stream, out Type concreteType))
            {
                throw new NullReferenceException($"Failed to resolve the concrete type for the abstract type '{expectedType.Name}'");
            }
            stream.Reset();
            return(this.Inner.Deserialize(stream, concreteType, nestedObjectDeserializer, out value));
        }