Esempio n. 1
0
        void write()
        {
            initializeUserTypes();

            writer.Write(0xBEEFCACE);
            writer.Write(1);
            writeReaderType();
            writer.Write(2);
            writer.Write(resources.Count);
            writer.Write(typeCreator.Count);
            foreach (var userType in typeCreator.getSortedTypes())
            {
                writer.Write(userType.Name);
            }
            int extraBytes = 8 - ((int)writer.BaseStream.Position & 7);

            if (extraBytes != 8)
            {
                for (int i = 0; i < extraBytes; i++)
                {
                    writer.Write((byte)'X');
                }
            }

            var nameOffsetStream = new MemoryStream();
            var nameOffsetWriter = new BinaryWriter(nameOffsetStream, Encoding.Unicode);
            var dataStream       = new MemoryStream();
            var dataWriter       = new BinaryWriter(dataStream);
            var hashes           = new int[resources.Count];
            var offsets          = new int[resources.Count];
            var formatter        = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.File | StreamingContextStates.Persistence));
            int index            = 0;

            foreach (var info in resources.ResourceElements)
            {
                offsets[index] = (int)nameOffsetWriter.BaseStream.Position;
                hashes[index]  = (int)hash(info.Name);
                index++;
                nameOffsetWriter.Write(info.Name);
                nameOffsetWriter.Write((int)dataWriter.BaseStream.Position);
                writeData(dataWriter, info, formatter);
            }

            Array.Sort(hashes, offsets);
            foreach (var hash in hashes)
            {
                writer.Write(hash);
            }
            foreach (var offset in offsets)
            {
                writer.Write(offset);
            }
            writer.Write((int)writer.BaseStream.Position + (int)nameOffsetStream.Length + 4);
            writer.Write(nameOffsetStream.ToArray());
            writer.Write(dataStream.ToArray());
        }