Spring – Rev 1
?pathlinks?
using System;
using System.IO;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace Spring.Serialization.Configuration
{
public static class ConfigurationSerialization
{
#region Private Delegates, Events, Enums, Properties, Indexers and Fields
private static XmlSerializer ConfigurationSerializer { get; } =
new XmlSerializer(typeof(global::Configuration.Configuration));
private static XmlReaderSettings XmlReaderSettings { get; } = new XmlReaderSettings
{
Async = true,
ValidationType = ValidationType.Schema,
IgnoreWhitespace = true,
ValidationFlags =
XmlSchemaValidationFlags
.ProcessInlineSchema |
XmlSchemaValidationFlags
.ProcessSchemaLocation |
XmlSchemaValidationFlags
.ReportValidationWarnings,
DtdProcessing = DtdProcessing.Parse
};
private static XmlWriterSettings XmlWriterSettings { get; } = new XmlWriterSettings
{
Async = true,
Indent = true,
IndentChars = " ",
OmitXmlDeclaration = false
};
#endregion
#region Public Methods
public static async Task<SerializationState> Serialize(this global::Configuration.Configuration configuration,
string file)
{
try
{
using (var streamWriter = new StreamWriter(file))
{
using (var xmlWriter =
XmlWriter.Create(streamWriter, XmlWriterSettings))
{
await xmlWriter.WriteDocTypeAsync("Configuration",
null,
null,
"<!ATTLIST Configuration xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>");
ConfigurationSerializer.Serialize(xmlWriter, configuration);
}
}
return new SerializationSuccess();
}
catch (Exception ex)
{
return new SerializationFailure { Exception = ex };
}
}
public static SerializationState Deserialize(FileInfo fileInfo)
{
try
{
global::Configuration.Configuration configuration;
using (var streamReader = new StreamReader(fileInfo.FullName))
{
using (var xmlReader = XmlReader.Create(streamReader, XmlReaderSettings))
{
configuration =
(global::Configuration.Configuration) ConfigurationSerializer.Deserialize(xmlReader);
}
}
return new SerializationSuccess<global::Configuration.Configuration>
{
Result = configuration
};
}
catch (Exception ex)
{
return new SerializationFailure
{
Exception = ex
};
}
}
public static SerializationState Deserialize(byte[] data)
{
try
{
global::Configuration.Configuration configuration;
using (var streamReader = new MemoryStream(data))
{
using (var xmlReader = XmlReader.Create(streamReader, XmlReaderSettings))
{
configuration =
(global::Configuration.Configuration) ConfigurationSerializer.Deserialize(xmlReader);
}
}
return new SerializationSuccess<global::Configuration.Configuration>
{
Result = configuration
};
}
catch (Exception ex)
{
return new SerializationFailure
{
Exception = ex
};
}
}
#endregion
}
}