Winify – Rev 61

Subversion Repositories:
Rev:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using Horizon.Utilities.Serialization;

namespace Winify.Utilities.Serialization
{
    public static class Serialization
    {
        #region Public Methods

        public static async Task<SerializationState> Deserialize<T>(string file, string targetNamespace,
            string schemeUri,
            CancellationToken cancellationToken)
        {
            var xmlSerializer = new XmlSerializer(typeof(T));

            var validationEventArgs = new List<ValidationEventArgs>();

            void XmlReaderSettingsValidationEventHandler(object sender, ValidationEventArgs e)
            {
                validationEventArgs.Add(e);
            }

            T servers;

            var settings = new XmlReaderSettings();

            try
            {
                settings.Async = true;
                settings.DtdProcessing = DtdProcessing.Parse;
                settings.ValidationType = ValidationType.Schema;

                settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema |
                                           XmlSchemaValidationFlags.ProcessSchemaLocation |
                                           XmlSchemaValidationFlags.ReportValidationWarnings |
                                           XmlSchemaValidationFlags.ProcessIdentityConstraints;

                settings.Schemas = new XmlSchemaSet();

                settings.ValidationEventHandler += XmlReaderSettingsValidationEventHandler;

                settings.Schemas.Add(targetNamespace, schemeUri);

                using var fileStream =
                    await Miscellaneous.GetFileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read,
                        cancellationToken);
                using var xmlReader = XmlReader.Create(fileStream,
                    settings);
                var stringBuilder = new StringBuilder();

                using (var stringWriter = new StringWriter(stringBuilder))
                {
                    while (await xmlReader.ReadAsync())
                        await stringWriter.WriteAsync(await xmlReader.ReadOuterXmlAsync());
                }

                using (var stringReader = new StringReader(stringBuilder.ToString()))
                {
                    servers =
                        (T)xmlSerializer
                            .Deserialize(stringReader);
                }
            }
            catch (Exception exception)
            {
                return new SerializationFailure(exception, validationEventArgs);
            }
            finally
            {
                settings.ValidationEventHandler -=
                    XmlReaderSettingsValidationEventHandler;
            }

            return new SerializationSuccess<T>(servers, validationEventArgs);
        }

        public static async Task<SerializationState> Serialize<T>(T servers, string file, string name, string subset,
            CancellationToken cancellationToken)
        {
            var xmlSerializer = new XmlSerializer(typeof(T));

            try
            {
                using var memoryStream = new MemoryStream();
                using var xmlWriter =
                    XmlWriter.Create(memoryStream,
                        new XmlWriterSettings
                        {
                            Async = true,
                            Indent = true,
                            IndentChars = "    ",
                            OmitXmlDeclaration = false
                        });
                await xmlWriter.WriteDocTypeAsync(name,
                    null,
                    null,
                    subset);

                xmlSerializer.Serialize(xmlWriter, servers);

                using var fileStream =
                    await Miscellaneous.GetFileStream(file, FileMode.Create, FileAccess.Write,
                        FileShare.Write,
                        cancellationToken);
                memoryStream.Position = 0L;

                await memoryStream.CopyToAsync(fileStream);
            }
            catch (Exception exception)
            {
                return new SerializationFailure(exception);
            }

            return new SerializationSuccess<T>();
        }

        #endregion
    }
}

Generated by GNU Enscript 1.6.5.90.