// TODO: Put strings into the resources. // protected virtual async Task <IVh <StreamInfo> > RecognizeMediaFormatAsync(ISubjectLoadContext ctx, Stream stream) { var isJson = P_TryRecognizeStreamContentAsJson(stream); if (isJson) { return(new StreamInfo(stream, false, contentMediaType: AppJson).ToValueHolder(true)); } else { var isXml = await P_TryRecognizeStreamContentAsXmlAsync(stream, ctx.CreateXmlReaderSettings()).ConfigureAwait(false); if (isXml) { return(new StreamInfo(stream, false, contentMediaType: AppXml).ToValueHolder(true)); } else { throw new NotSupportedException(message: $"Формат содержимого потока не распознан или не поддерживается.{Environment.NewLine}\tКомпонент:{this.FmtStr().GNLI2()}{Environment.NewLine}\tКонтекст:{ctx.FmtStr().GNLI2()}{Environment.NewLine}\tПоток:{stream.FmtStr().GNLI2()}"); } } }
// TODO: Put strings into the resources. // protected virtual async Task <TSubject> DoMaterializeAsync(ISubjectLoadContext ctx, StreamInfo stream) { ctx.EnsureNotNull(nameof(ctx)); stream.EnsureNotNull(nameof(stream)); // await Task.CompletedTask; TSubject subject; var deserializedObjectAsIDisposable = default(IDisposable); try { object deserializedObject; if (IsJsonMediaType(mediaTypeName: stream.ContentMediaType)) { // JSON. // var jsonSerializer = ctx.CreateJsonSerializer(); using (var textReader = new StreamReader(stream.Stream, Encoding.UTF8, true, TextReaderWriterUtilities.DefaultBufferSize, true)) using (var jsonReader = new JsonTextReader(textReader)) deserializedObjectAsIDisposable = (deserializedObject = jsonSerializer.Deserialize(jsonReader)) as IDisposable; } else if (IsXmlMediaType(mediaTypeName: stream.ContentMediaType)) { // XML. // var xmlObjectSerializer = ctx.CreateXmlObjectSerializer(type: typeof(object)); using (var xmlReader = XmlReader.Create(input: stream.Stream, settings: ctx.CreateXmlReaderSettings().CopyWith(closeInput: false))) deserializedObjectAsIDisposable = (deserializedObject = xmlObjectSerializer.ReadObject(xmlReader, false)) as IDisposable; } else { throw new NotSupportedException($"Медиа-тип содержимого потока не поддерживается.{Environment.NewLine}\tМедиа-тип:{stream.ContentMediaType.FmtStr().GNLI2()}"); } // subject = deserializedObject as TSubject; if (subject is null && !(deserializedObject is null)) { throw new EonException(message: $"Десериализованный объект имеет тип, не совместимый с требуемым.{Environment.NewLine}\tТип десериализованного объекта:{deserializedObject.GetType().FmtStr().GNLI2()}{Environment.NewLine}\tТребуемый тип:{typeof(TSubject).FmtStr().GI2()}."); } // return(subject); } catch (Exception exception) { DisposeMany(exception: exception, disposables: deserializedObjectAsIDisposable); throw; } }