/// <summary> /// Сериализация (сохранение) передаваемого экземпляра /// </summary> /// <typeparam name="TManifest">Тип сохраняемого манфиеста</typeparam> /// <param name="manifest">Сохраянемый экземпляр</param> /// <param name="pathName">Полный путь сохраняемого файла</param> /// <returns>Возвращает флаг успешного сохранения экземпляра</returns> protected internal static bool Serialize <TManifest>(TManifest manifest, string pathName) where TManifest : XmlManifest { try { XmlSerializer xs = GetSerializer <TManifest>(); using (MutexLocker.Lock(typeof(TManifest).FullName)) { using (var fw = File.Create(pathName)) xs.Serialize(fw, manifest); } manifest.FileInfo = new FileInfo(pathName); return(true); } catch (Exception ex) { if (ThrowSerializeExceptions) { throw; } if (LogExceptions) { m_loger.Log("Возникло исключение при сериализации манифеста", ex , new LogParameter("Тип манифеста", typeof(TManifest).FullName) , new LogParameter("Путь к файлу", pathName)); } return(false); } }
/// <summary> /// Десериализация манифеста из файла /// </summary> /// <typeparam name="TManifest">Тип манифеста</typeparam> /// <param name="pathName">Полный путь к десериализуемому файлу</param> /// <param name="rebuildOnEx">Перезапись существующего файла файлом по умолчанию в случае ошибки десериализации</param> /// <returns>Возвращает десериализованный экземпляр или экземпляр по умолчанию</returns> protected internal static TManifest Deserialize <TManifest>(string pathName, bool rebuildOnEx = false) where TManifest : XmlManifest, new() { try { TManifest manifest = null; if (string.IsNullOrEmpty(pathName)) { manifest = (TManifest) new TManifest().GetDefault(); pathName = manifest.GetDefaultFileName(); } if (!File.Exists(pathName)) { manifest = (TManifest) new TManifest().GetDefault(); manifest.FileInfo = new FileInfo(pathName); try { using (MutexLocker.Lock(typeof(TManifest).FullName)) manifest.Save(pathName); } catch (Exception ex) { m_loger.Log("Возникло исключение при генерации манифеста по умолчанию", ex, MessageType.Warning, new LogParameter("Файл", LogMessageBuilder.GetStringLogVal(pathName))); } return(manifest); } using (var sr = new StringReader(File.ReadAllText(pathName))) { XmlSerializer xs = GetSerializer <TManifest>(); manifest = xs.Deserialize(sr) as TManifest; manifest.FileInfo = new FileInfo(pathName); return(manifest); } } catch (Exception ex) { if (ThrowSerializeExceptions) { throw; } if (LogExceptions) { m_loger.Log("Возникло исключение при десериализации манифеста. Манифест будет удалён и перегенерирован заново.", ex , new LogParameter("Тип манифеста", typeof(TManifest).FullName) , new LogParameter("Путь к файлу", pathName)); } TManifest newMon = null; if (!rebuildOnEx) { return(newMon); } else { try { //пересоздаём манифест по умолчанию newMon = new TManifest(); if (File.Exists(pathName)) { File.Delete(pathName); } using (MutexLocker.Lock(typeof(TManifest).FullName)) Serialize(newMon, pathName); return(newMon); } catch (Exception subEx) { if (LogExceptions) { m_loger.Log("Возникло исключение при попытке сериализации манифеста по умолчанию. Возвращена пустая ссылка на манифест", subEx , new LogParameter("Тип манифеста", typeof(TManifest).FullName) , new LogParameter("Путь к файлу", pathName)); } return(null); } } } }