using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace System.Application.Serialization { public class FileSettingsProvider : ISerializationProvider { private readonly string _path; private readonly object _sync = new object(); private SortedDictionary _settings = new SortedDictionary(); public bool IsLoaded { get; private set; } public FileSettingsProvider(string path) { this._path = path; } public void SetValue(string key, T value) { lock (this._sync) { this._settings[key] = value; } } public bool TryGetValue(string key, out T value) { lock (this._sync) { object obj; if (this._settings.TryGetValue(key, out obj) && obj is T) { value = (T)obj; return true; } } value = default(T); return false; } public bool RemoveValue(string key) { lock (this._sync) { return this._settings.Remove(key); } } public void Save() { if (this._settings.Count == 0) return; var dir = Path.GetDirectoryName(this._path); if (dir == null) throw new DirectoryNotFoundException(); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } lock (this._sync) { using var stream = new FileStream(this._path, FileMode.Create, FileAccess.ReadWrite); if (stream.Position > 0) { stream.Position = 0; } var data = Serializable.SMP(this._settings); stream.Write(data, 0, data.Length); //XamlServices.Save(stream, this._settings); } } public void Load() { if (File.Exists(this._path)) { using var stream = new FileStream(this._path, FileMode.Open, FileAccess.Read); lock (this._sync) { if (stream.Position > 0) { stream.Position = 0; } var source = Serializable.DMP>(stream); //var source = XamlServices.Load(stream) as IDictionary; this._settings = source == null ? new SortedDictionary() : new SortedDictionary(source); } } else { lock (this._sync) { this._settings = new SortedDictionary(); } } this.IsLoaded = true; } event EventHandler ISerializationProvider.Reloaded { add { } remove { } } } }