From e982d7ee6f4b74d11bfacf8beebd1c0c7e3407fe Mon Sep 17 00:00:00 2001 From: Flamefire Date: Mon, 27 Oct 2014 17:51:06 +0100 Subject: [PATCH] Serialize to/from string --- Vocaluxe/Base/CConfig.cs | 3 +- VocaluxeLib/Xml/CXmlSerializer.cs | 54 +++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs index 5426ba27..98ef2d1d 100644 --- a/Vocaluxe/Base/CConfig.cs +++ b/Vocaluxe/Base/CConfig.cs @@ -196,7 +196,8 @@ namespace Vocaluxe.Base Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameSongs) #if INSTALLER - ,Path.Combine(CSettings.DataFolder, CSettings.FolderNameSongs); + , + Path.Combine(CSettings.DataFolder, CSettings.FolderNameSongs) #endif }; /// diff --git a/VocaluxeLib/Xml/CXmlSerializer.cs b/VocaluxeLib/Xml/CXmlSerializer.cs index 41daa05c..6a0d3a46 100644 --- a/VocaluxeLib/Xml/CXmlSerializer.cs +++ b/VocaluxeLib/Xml/CXmlSerializer.cs @@ -3,6 +3,7 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; +using System.IO; using System.Linq; using System.Reflection; using System.Text; @@ -102,6 +103,8 @@ namespace VocaluxeLib.Xml return _GetPrimitiveValue(node, type); if (type.IsNullable()) { + if (!node.HasChildNodes) + return null; Type subType = type.GetGenericArguments()[0]; return _GetValue(node, subType); } @@ -372,7 +375,8 @@ namespace VocaluxeLib.Xml { Debug.Assert(!isAttribute, "Complex types cannot be attributes"); writer.WriteStartElement(name); - _WriteChildNodes(writer, value); + if (value != null) + _WriteChildNodes(writer, value); writer.WriteEndElement(); } } @@ -411,6 +415,24 @@ namespace VocaluxeLib.Xml return (T)result; } + public T DeserializeString(string xml) where T : new() + { + var reader = new XmlTextReader(new StringReader(xml)) + { + WhitespaceHandling = WhitespaceHandling.Significant, + Normalization = true, + XmlResolver = null + }; + try + { + return _Deserialize(reader); + } + finally + { + reader.Close(); + } + } + public T Deserialize(string filePath) where T : new() { var reader = new XmlTextReader(filePath) @@ -429,7 +451,7 @@ namespace VocaluxeLib.Xml } } - public void Serialize(string filePath, object o) + private void _Serialize(object o, XmlWriter writer) { XmlRootAttribute root = o.GetType().GetAttribute(); string name; @@ -443,15 +465,27 @@ namespace VocaluxeLib.Xml else name = "root"; } + writer.WriteStartDocument(); + writer.WriteStartElement(name); + _WriteChildNodes(writer, o); + writer.WriteEndElement(); + writer.WriteEndDocument(); + writer.Flush(); + } + + public void Serialize(string filePath, object o) + { using (XmlWriter writer = XmlWriter.Create(filePath, _XMLSettings)) - { - writer.WriteStartDocument(); - writer.WriteStartElement(name); - _WriteChildNodes(writer, o); - writer.WriteEndElement(); - writer.WriteEndDocument(); - writer.Flush(); - } + _Serialize(o, writer); + } + + public string Serialize(object o) + { + MemoryStream result = new MemoryStream(); + using (XmlWriter writer = XmlWriter.Create(result, _XMLSettings)) + _Serialize(o, writer); + result.Position = 0; + return new StreamReader(result).ReadToEnd(); } } } \ No newline at end of file