public virtual void Save(DataFile <T> dataFile)
        {
            if (!dataFile.ParentDirectory.Exists)
            {
                dataFile.ParentDirectory.Create(true);
            }

            using (var writer = dataFile.File.GetContent().GetWriter())
            {
                this.Serializer.Serialize(dataFile.Value, writer);
            }
        }
        public virtual T Load(DataFile <T> dataFile)
        {
            const int retrycount = 10;

            for (var i = 0; i < retrycount; i++)
            {
                try
                {
                    using (var reader = dataFile.File.GetContent().GetReader())
                    {
                        var retval = this.Deserializer.Deserialize(reader);

                        if (retval is IObjectWithGeneratedDefaults)
                        {
                            if (((IObjectWithGeneratedDefaults)retval).RequiresGeneratedDefaults)
                            {
                                ((IObjectWithGeneratedDefaults)retval).GenerateDefaults();

                                Save(dataFile, retval);
                            }
                        }

                        return(retval);
                    }
                }
                catch (Exception)
                {
                    if (i == retrycount - 1)
                    {
                        throw;
                    }
                }

                System.Threading.Thread.Sleep(500);
            }

            throw new InvalidOperationException();
        }