// marked internal for testing (perhaps we should use reflection to test)
        internal void LoadFastLoadData()
        {
            FastLoadData data = null;

            try {
                using (var stream = ProtectedFileStream.OpenSharedReader(FastLoadFile)) {
                    data = Serializer.Deserialize <object>(stream) as FastLoadData;
                }
            } catch (Exception e) {
                Logger.ReportException("Failed to load fast load data: ", e);
            }

            if (data != null && data.Items != null)
            {
                lock (dictionary) {
                    foreach (var item in data.Items)
                    {
                        if (!dictionary.ContainsKey(item.Guid))
                        {
                            dictionary[item.Guid] = new DatedObject()
                            {
                                FileDate = DateTime.MinValue, Data = item.Data
                            };
                        }
                    }
                }

                Logger.ReportInfo("Successfully loaded fastload data for : " + path + " " + typeof(T).ToString());
            }
        }
        public void Validate()
        {
            var loadedData = new Dictionary <Guid, T>();
            var directory  = Kernel.Instance.GetLocation <IFolderMediaLocation>(path);

            List <Guid> validChildren = new List <Guid>();

            foreach (var item in directory.Children.OrderBy(key => key.DateModified).Reverse())
            {
                if (item is IFolderMediaLocation)
                {
                    continue;
                }
                if (item.Path == FastLoadFile)
                {
                    continue;
                }

                var         guid = GetGuid(item.Path);
                DatedObject data;

                if (guid != null)
                {
                    lock (dictionary) {
                        if (dictionary.TryGetValue(guid.Value, out data))
                        {
                            if (data.FileDate == item.DateModified)
                            {
                                validChildren.Add(guid.Value);
                                continue;
                            }
                        }
                    }
                }

                T obj = LoadFile(item.Path);

                if (obj != null)
                {
                    SetInternalData(guid.Value, obj, item.DateModified);
                    validChildren.Add(guid.Value);
                }
            }

            lock (dictionary) {
                foreach (var key in dictionary.Keys.Except(validChildren).ToArray())
                {
                    dictionary.Remove(key);
                }
            }

            // Save the fastload file

            FastLoadData fastLoadData;

            lock (dictionary) {
                fastLoadData = new FastLoadData()
                {
                    Items = dictionary.Select(pair => new IdentifiableData()
                    {
                        Guid = pair.Key, Data = pair.Value.Data
                    })
                            .ToList()
                };
            }

            using (var stream = ProtectedFileStream.OpenExclusiveWriter(FastLoadFile)) {
                Serializer.Serialize <object>(stream, fastLoadData);
            }

            Logger.ReportInfo("Finished validating : " + path + " " + typeof(T).ToString());
        }