XMLSerializer.cs

125 lines | 4.243 kB Blame History Raw Download
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO;
using System.Xml.Serialization;

using ConfigurationTool.CustomSerializer;

namespace ConfigurationTool.Serializer
{
    class XMLSerializer<T>
        : ISerializer<T>
        where T : class, new()
    {
        public T Import(string file)
        {
            var a = typeof(T).GetInterfaces();
            var b = typeof(T).GetInterface("ICustomSerialazible");

            if (typeof(T).GetInterface("ICustomSerialazible") == null)
            {
                // передаем в конструктор тип класса
                XmlSerializer formatter = new XmlSerializer(typeof(T));

                // десериализация
                using (FileStream fs = new FileStream(file, FileMode.Open))
                {
                    return (T)formatter.Deserialize(fs);
                }
            }
            else
            {
                ICustomSerialazible res = (ICustomSerialazible)new T();

                // передаем в конструктор тип класса
                XmlSerializer formatter = new XmlSerializer(res.SerialazibleType);

                // десериализация
                using (FileStream fs = new FileStream(file, FileMode.Open))
                {
                    res.Import(formatter.Deserialize(fs));
                }

                return (T)res;
            }
        }

        public void Export(T data, string file)
        {
            if (typeof(T).GetInterface("ICustomSerialazible") == null)
            {
                // передаем в конструктор тип класса
                XmlSerializer formatter = new XmlSerializer(typeof(T));

                // получаем поток, куда будем записывать сериализованный объект
                using (FileStream fs = new FileStream(file, FileMode.Create))
                {
                    formatter.Serialize(fs, data);
                }
            }
            else
            {
                ICustomSerialazible entity = (ICustomSerialazible)data;

                // передаем в конструктор тип класса
                XmlSerializer formatter = new XmlSerializer(entity.SerialazibleType);

                // получаем поток, куда будем записывать сериализованный объект
                using (FileStream fs = new FileStream(file, FileMode.Create))
                {
                    formatter.Serialize(fs, entity.Export());
                }
            }
        }


        public T Import(Stream stream)
        {
            if (typeof(T).GetInterface("ICustomSerialazible") == null)
            {
                // передаем в конструктор тип класса
                XmlSerializer formatter = new XmlSerializer(typeof(T));

                // десериализация
                return (T)formatter.Deserialize(stream);
            }
            else
            {
                ICustomSerialazible res = (ICustomSerialazible)new T();

                // передаем в конструктор тип класса
                XmlSerializer formatter = new XmlSerializer(res.SerialazibleType);

                // десериализация                
                res.Import(formatter.Deserialize(stream));

                return (T)res;
            }
        }

        public void Export(T data, Stream stream)
        {
            if (typeof(T).GetInterface("ICustomSerialazible") == null)
            {
                // передаем в конструктор тип класса
                XmlSerializer formatter = new XmlSerializer(typeof(T));
      
                formatter.Serialize(stream, data);
            }
            else
            {
                ICustomSerialazible entity = (ICustomSerialazible)data;

                // передаем в конструктор тип класса
                XmlSerializer formatter = new XmlSerializer(entity.SerialazibleType);
         
                formatter.Serialize(stream, entity.Export());
            }
        }
    }
}