using Rage; using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace SceneManager.Utils { internal static class Serializer { private static Dictionary _serializerCache = new Dictionary(); private static XmlSerializer _getOrCreateSerializer(XmlAttributeOverrides overrides = null) { if (_serializerCache.ContainsKey(typeof(T))) { Game.LogTrivialDebug("Serializer cache already contains " + typeof(T).Name); return _serializerCache[typeof(T)]; } else { Game.LogTrivialDebug("Adding " + typeof(T).Name + " to serializer cache"); Game.LogTrivialDebug("Overrides specified: " + (overrides != null)); var s = new XmlSerializer(typeof(T), overrides); _serializerCache.Add(typeof(T), s); return s; } } public static void SaveToNode(string file, string node, string value) { XmlNode n = SelectNodeFromXml(file, node); if (n == null) throw new KeyNotFoundException($"{nameof(SaveToNode)}: specified node does not exists!"); n.InnerText = value; var doc = new XmlDocument(); doc.Save(file); } public static string ReadFromNode(string file, string node) { return SelectNodeFromXml(file, node).InnerText; } private static XmlNode SelectNodeFromXml(string filePath, string node) { if (!File.Exists(filePath)) throw new FileNotFoundException($"{nameof(SelectNodeFromXml)}(): specified file does not exist: {filePath}"); using (TextReader reader = new StreamReader(filePath)) { var doc = new XmlDocument(); doc.Load(reader); return doc.SelectSingleNode(node); } } public static List LoadAllXML(string dirPath, SearchOption searchOption = SearchOption.AllDirectories) { if (!Directory.Exists(dirPath)) throw new DirectoryNotFoundException($"{nameof(LoadAllXML)}(): specified directory could not be found: {dirPath}"); string[] files = Directory.GetFiles(dirPath, "*.xml", searchOption); List result = new List(); Array.ForEach(files, f => result.AddRange(LoadFromXML(f))); return result; } public static void SaveToXML(List list, string filePath) { SaveItemToXML(list, filePath); } public static void SaveItemToXML(T item, string path, XmlAttributeOverrides overrides = null) { Encoding utf8NoBom = new UTF8Encoding(false); using (TextWriter writer = new StreamWriter(path, false, utf8NoBom)) { XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); _getOrCreateSerializer(overrides).Serialize(writer, item, ns); } } //public static void SaveItemToXML(T item, string path) //{ // SaveItemToXML(item, path, null); //} public static T LoadItemFromXML(string filePath, XmlAttributeOverrides overrides = null) { if (!File.Exists(filePath)) throw new FileNotFoundException($"{nameof(LoadItemFromXML)}(): specified file does not exist: {filePath}"); using (TextReader reader = new StreamReader(filePath)) { return (T)_getOrCreateSerializer(overrides).Deserialize(reader); } } //public static T LoadItemFromXML(string filePath) //{ // return LoadItemFromXML(filePath, null); //} public static void ModifyItemInXML(string filePath, Action modification) { T item = LoadItemFromXML(filePath); modification(item); SaveItemToXML(item, filePath); } public static T GetSelectedListElementFromXml(string file, Func, T> selector) { List deserialized = LoadItemFromXML>(file); return selector(deserialized); } public static List LoadFromXML(string filePath) { return LoadItemFromXML>(filePath); } public static void AppendToXML(T objectToAdd, string path) { ModifyItemInXML>(path, t => t.Add(objectToAdd)); } } }