private (SCHEMA2 Model, Validation.ValidationResult Validation) _ReadGLB(Stream stream) { Guard.NotNull(stream, nameof(stream)); IReadOnlyDictionary <uint, byte[]> chunks; try { chunks = BinarySerialization.ReadBinaryFile(stream); } catch (System.IO.EndOfStreamException ex) { var vr = new Validation.ValidationResult(null, this.Validation); vr.SetError(new Validation.SchemaException(null, ex.Message)); return(null, vr); } catch (Validation.SchemaException ex) { var vr = new Validation.ValidationResult(null, this.Validation); vr.SetError(ex); return(null, vr); } var context = this; if (chunks.ContainsKey(BinarySerialization.CHUNKBIN)) { // clone self var binChunk = chunks[BinarySerialization.CHUNKBIN]; context = new ReadContext(context); context._BinaryChunk = binChunk; } var jsonChunk = chunks[BinarySerialization.CHUNKJSON]; return(context._Read(jsonChunk)); }
private (SCHEMA2 Model, Validation.ValidationResult Validation) _Read(ReadOnlyMemory <Byte> jsonUtf8Bytes) { var root = new SCHEMA2(); var vcontext = new Validation.ValidationResult(root, this.Validation); #if !SUPRESSTRYCATCH try { #endif if (jsonUtf8Bytes.IsEmpty) { throw new System.Text.Json.JsonException("JSon is empty."); } var reader = new Utf8JsonReader(jsonUtf8Bytes.Span); if (!reader.Read()) { vcontext.SetError(new Validation.SchemaException(root, "Json is empty")); return(null, vcontext); } root.Deserialize(ref reader); root.OnDeserializationCompleted(); // binary chunk check foreach (var b in root.LogicalBuffers) { b.OnValidateBinaryChunk(vcontext.GetContext(), this._BinaryChunk); } // schema validation if (this._CheckSupportedExtensions) { root._ValidateExtensions(vcontext.GetContext()); var ex = vcontext.Errors.FirstOrDefault(); if (ex != null) { return(null, vcontext); } } // we must do a basic validation before resolving external dependencies if (true) { root.ValidateReferences(vcontext.GetContext()); var ex = vcontext.Errors.FirstOrDefault(); if (ex != null) { return(null, vcontext); } } // resolve external dependencies root._ResolveSatelliteDependencies(this); // full validation if (this.Validation != VALIDATIONMODE.Skip) { root.ValidateContent(vcontext.GetContext()); var ex = vcontext.Errors.FirstOrDefault(); if (ex != null) { return(null, vcontext); } } #if !SUPRESSTRYCATCH } catch (JsonException rex) { vcontext.SetError(new Validation.SchemaException(root, rex)); return(null, vcontext); } catch (System.FormatException fex) { vcontext.SetError(new Validation.ModelException(null, fex)); return(null, vcontext); } catch (ArgumentException aex) { vcontext.SetError(new Validation.ModelException(root, aex)); return(null, vcontext); } catch (Validation.ModelException mex) { vcontext.SetError(mex); return(null, vcontext); } #endif return(root, vcontext); }