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()); }