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);
        }
예제 #2
0
        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);
                }
            }
        }