Spring – Rev 1

Subversion Repositories:
Rev:
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
    }
}