protected void SaveServices(SaveMetrics metrics)
        {
            Dictionary<CustomSerial, BaseService> services = World.Services;

            GenericWriter indexWriter;
            GenericWriter typeWriter;
            GenericWriter dataWriter;

            if (this.UseSequentialWriters)
            {
                indexWriter = new BinaryFileWriter(World.ServiceIndexPath, false);
                typeWriter = new BinaryFileWriter(World.ServiceTypesPath, false);
                dataWriter = new BinaryFileWriter(World.ServicesDataPath, true);
            }
            else
            {
                indexWriter = new AsyncWriter(World.ServiceIndexPath, false);
                typeWriter = new AsyncWriter(World.ServiceTypesPath, false);
                dataWriter = new AsyncWriter(World.ServicesDataPath, true);
            }

            indexWriter.Write(services.Count);

            foreach (BaseService service in services.Values)
            {
                long start = dataWriter.Position;

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

                service.Serialize(dataWriter);

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

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

            typeWriter.Write(World._ServiceTypes.Count);

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

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