public XnbFile <T> Deserialize <T>(Stream stream) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } var xnbResult = new XnbFile <T>(); var xnbStreamReader = new XnbStreamReader(stream); // check if file starts with XNB ValidatePrefix(xnbStreamReader); // read the XNB target OS xnbResult.XnbTargetOs = ReadTargetOs(xnbStreamReader); // read the XNB format version xnbResult.FormatVersion = ReadFormatVersion(xnbStreamReader); // read the XNB flag var flags = xnbResult.Flags = ReadFlags(xnbStreamReader); // read the file size var size = xnbResult.Size = (int)xnbStreamReader.ReadUInt32(); // check if encoded. If so, decode stream xnbStreamReader = DecodeXnbStreamReader(xnbStreamReader, flags, size); var xnbReaderManager = new XnbReaderManager(); xnbReaderManager.ReadReaders(xnbStreamReader); // ensure there are no shared resources var sharedResourcesCount = xnbStreamReader.Read7BitEncodedInt(); if (sharedResourcesCount != 0) { throw new NotSupportedException("Shared resources are not supported"); } int readerIndex = xnbStreamReader.Read7BitEncodedInt(); var reader = xnbReaderManager.XnbReaderFromIndex(readerIndex); if (reader == null) { xnbResult.Content = default(T); } else if (reader.Read(xnbReaderManager, xnbStreamReader) is T content) { xnbResult.Content = content; } else { throw new XnbException("Invalid type"); } return(xnbResult); }
public void ReadReaders(XnbStreamReader streamReader) { lock (_xnbTypeReaders) { if (_resolvedReaders) { throw new XnbException("Already resolved readers"); } _resolvedReaders = true; int readerCount = streamReader.Read7BitEncodedInt(); for (var i = 0; i < readerCount; i++) { string readerName = streamReader.ReadString(); int version = streamReader.ReadInt32(); Type readerType = XnbTypeReaderTypeResolver.ResolveFromName(readerName); XnbTypeReader reader = XnbReaderFactory.CreateReaderFromType(readerType); _xnbTypeReaders.Add(reader); } } }