public void Save(IEnumerable <RemoteElement> elements) { XmlDocument document = new XmlDocument(); document.Schemas.Add(_Schema); RemoteControls persistenceModel = new RemoteControls(); foreach (var e in elements) { e.Deflate(document); } persistenceModel.Items = elements.ToArray(); using (StringWriter writer = new StringWriter()) { XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; using (XmlWriter xmlWriter = XmlWriter.Create(writer, settings)) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(RemoteControls)); xmlSerializer.Serialize(xmlWriter, persistenceModel); } _SaveQueue.Enqueue(writer.ToString()); } Task.Factory.StartNew(() => { string toSave; while (_SaveQueue.TryDequeue(out toSave)) { lockObj.EnterWriteLock(); try { File.Copy(_XmlFilename, _XmlFilename + ".bak", true); using (var stream = File.Create(_XmlFilename)) { using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine(toSave); } } } catch (Exception ex) { _Log.Error(string.Format("Failed to save \"Controls.xml\": {0}", ex.Message), ex); } finally { lockObj.ExitWriteLock(); } } }); }
public IEnumerable <RemoteElement> Load() { lockObj.EnterReadLock(); try { using (StreamReader reader = new StreamReader(File.OpenRead(_XmlFilename))) { XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; settings.IgnoreProcessingInstructions = true; settings.IgnoreWhitespace = true; settings.Schemas.Add(_Schema); settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; using (XmlReader xmlReader = XmlReader.Create(reader, settings)) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(RemoteControls)); RemoteControls deserialized = (RemoteControls)xmlSerializer.Deserialize(xmlReader); foreach (RemoteElement element in deserialized.Items) { var result = element.Inflate(_PluginManager); if (!result.Success) { foreach (var error in result.Errors) { _Log.WarnFormat("Failed to inflate control \"{0}\": {1}", element, error); } } } return(new List <RemoteElement>(deserialized.Items)); } } } finally { lockObj.ExitReadLock(); } }