protected void SaveModules(SaveMetrics metrics)
        {
            Dictionary<CustomSerial, BaseModule> modules = World.Modules;

            GenericWriter indexWriter;
            GenericWriter typeWriter;
            GenericWriter dataWriter;

            if (this.UseSequentialWriters)
            {
                indexWriter = new BinaryFileWriter(World.ModuleIndexPath, false);
                typeWriter = new BinaryFileWriter(World.ModuleTypesPath, false);
                dataWriter = new BinaryFileWriter(World.ModulesDataPath, true);
            }
            else
            {
                indexWriter = new AsyncWriter(World.ModuleIndexPath, false);
                typeWriter = new AsyncWriter(World.ModuleTypesPath, false);
                dataWriter = new AsyncWriter(World.ModulesDataPath, true);
            }

            indexWriter.Write(modules.Count);

            foreach (BaseModule module in modules.Values)
            {
                long start = dataWriter.Position;

                indexWriter.Write(module._TypeID);
                indexWriter.Write((int)module.Serial);
                indexWriter.Write(start);

                module.Serialize(dataWriter);

                if (metrics != null)
                    metrics.OnModuleSaved((int)(dataWriter.Position - start));

                dataWriter.Write((int)(dataWriter.Position - start));
            }

            indexWriter.Write(World._ModuleTypes.Count);

            for (int i = 0; i < World._ModuleTypes.Count; ++i)
                typeWriter.Write(World._ModuleTypes[i].FullName);

            indexWriter.Close();
            typeWriter.Close();
            dataWriter.Close();
        }