private static TSettings deserialize <TSettings>(string filename, SettingsSerializer serializer) where TSettings : SettingsBase, new() { return(Ut.WaitSharingVio(maximum: TimeSpan.FromSeconds(5), func: () => { switch (serializer) { case SettingsSerializer.ClassifyXml: return ClassifyXml.DeserializeFile <TSettings>(filename); case SettingsSerializer.ClassifyJson: return ClassifyJson.DeserializeFile <TSettings>(filename); case SettingsSerializer.ClassifyBinary: return ClassifyBinary.DeserializeFile <TSettings>(filename); case SettingsSerializer.DotNetBinary: var bf = new BinaryFormatter(); using (var fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) return (TSettings)bf.Deserialize(fs); default: throw new InternalErrorException("6843184"); } })); }
/// <summary>Logs a message to the underlying stream.</summary> public override void Log(uint verbosity, LogType type, string message) { if (VerbosityLimit[type] < verbosity || Filename == null) { return; } if (message == null) { message = "<null>"; } lock (this) { string fmtInfo, indent; GetFormattedStrings(out fmtInfo, out indent, verbosity, type); Ut.WaitSharingVio(maximum: SharingVioWait, action: () => { // Ensure that other processes can only read from the file, but not also write to it using (var f = File.Open(Filename, FileMode.Append, FileAccess.Write, FileShare.Read)) using (var s = new StreamWriter(f)) { s.Write(fmtInfo); s.WriteLine(message); } }); } }
internal static void serialize(object settings, Type settingsType, string filename, SettingsSerializer serializer) { var tempname = filename + ".~tmp"; Ut.WaitSharingVio(() => { switch (serializer) { case SettingsSerializer.ClassifyXml: // SerializeToFile automatically creates the folder if necessary ClassifyXml.SerializeToFile(settingsType, settings, tempname, format: ClassifyXmlFormat.Create("Settings")); break; case SettingsSerializer.ClassifyJson: // SerializeToFile automatically creates the folder if necessary ClassifyJson.SerializeToFile(settingsType, settings, tempname); break; case SettingsSerializer.ClassifyBinary: // SerializeToFile automatically creates the folder if necessary ClassifyBinary.SerializeToFile(settingsType, settings, tempname); break; case SettingsSerializer.DotNetBinary: PathUtil.CreatePathToFile(tempname); var bf = new BinaryFormatter(); using (var fs = File.Open(tempname, FileMode.Create, FileAccess.Write, FileShare.Read)) bf.Serialize(fs, settings); break; default: throw new InternalErrorException("4968453"); } File.Delete(filename); File.Move(tempname, filename); }, TimeSpan.FromSeconds(5)); }