From 7d1aa35f191a9f74338cf281c74812289f4cf15c Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 7 May 2021 04:08:18 -0600 Subject: [PATCH] Renamed PathXMLManager to Serializer --- SceneManager/Utils/Serializer.cs | 133 +++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 SceneManager/Utils/Serializer.cs diff --git a/SceneManager/Utils/Serializer.cs b/SceneManager/Utils/Serializer.cs new file mode 100644 index 0000000..da0bf3f --- /dev/null +++ b/SceneManager/Utils/Serializer.cs @@ -0,0 +1,133 @@ +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) + { + Encoding utf8NoBom = new UTF8Encoding(false); + using (TextWriter writer = new StreamWriter(path, false, utf8NoBom)) + { + XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); + ns.Add("", ""); + + //new XmlSerializer(typeof(Objects.Path)).Serialize(writer, item); + _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) + { + 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)); + } + } +}