/// <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)); }