ToolPack1

В проект ConfigTool добавлена поддержка использования кастомной

10/10/2019 1:08:16 PM

Details

diff --git a/Build/ConfigurationTool.dll b/Build/ConfigurationTool.dll
index 60a0dbc..5321ace 100644
Binary files a/Build/ConfigurationTool.dll and b/Build/ConfigurationTool.dll differ
diff --git a/Build/ConfigurationTool.pdb b/Build/ConfigurationTool.pdb
index 9dbbfe4..41a897b 100644
Binary files a/Build/ConfigurationTool.pdb and b/Build/ConfigurationTool.pdb differ
diff --git a/ToolPack1/ConfigurationTool/ConfigEntity.cs b/ToolPack1/ConfigurationTool/ConfigEntity.cs
index 2ee2b39..74a2224 100644
--- a/ToolPack1/ConfigurationTool/ConfigEntity.cs
+++ b/ToolPack1/ConfigurationTool/ConfigEntity.cs
@@ -14,7 +14,7 @@ namespace ConfigurationTool
     //Singlethon сущность конфига 
     public class ConfigEntity<T>
         : ISignlethonWithParams<ConfigParams>
-        where T : new()
+        where T : class, new()
     {
         //Параметры конфига
         public ConfigParams Params { private set; get; }
diff --git a/ToolPack1/ConfigurationTool/ConfigurationManager.cs b/ToolPack1/ConfigurationTool/ConfigurationManager.cs
index ce6d039..4d98d7e 100644
--- a/ToolPack1/ConfigurationTool/ConfigurationManager.cs
+++ b/ToolPack1/ConfigurationTool/ConfigurationManager.cs
@@ -10,7 +10,7 @@ namespace ConfigurationTool
 {      
     //Обеспечивате доступ к конфигу
     public sealed class ConfigurationManager<T>
-        where T:new()
+        where T: class, new()
     {
         //Конфиг
         private ConfigEntity<T> Config => SignlethonWithParams<ConfigEntity<T>, ConfigParams>.Get();
diff --git a/ToolPack1/ConfigurationTool/ConfigurationTool.csproj b/ToolPack1/ConfigurationTool/ConfigurationTool.csproj
index 751c274..ab29e2f 100644
--- a/ToolPack1/ConfigurationTool/ConfigurationTool.csproj
+++ b/ToolPack1/ConfigurationTool/ConfigurationTool.csproj
@@ -46,6 +46,7 @@
     <Compile Include="ConfigEntity.cs" />
     <Compile Include="ConfigParams.cs" />
     <Compile Include="ConfigurationManager.cs" />
+    <Compile Include="ICustomSerialazible.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Serializer\BinarySerializer.cs" />
     <Compile Include="Serializer\ISerializer.cs" />
diff --git a/ToolPack1/ConfigurationTool/ICustomSerialazible.cs b/ToolPack1/ConfigurationTool/ICustomSerialazible.cs
new file mode 100644
index 0000000..443ad84
--- /dev/null
+++ b/ToolPack1/ConfigurationTool/ICustomSerialazible.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace ConfigurationTool
+{
+    public interface ICustomSerialazible
+    {
+        /// <summary>
+        /// Промежуточный тип, используемый при сериализации данной сущности
+        /// </summary>
+        Type SerialazibleType { get; }
+
+
+        object Export();
+        void Import(object obj);
+    }
+}
diff --git a/ToolPack1/ConfigurationTool/Serializer/BinarySerializer.cs b/ToolPack1/ConfigurationTool/Serializer/BinarySerializer.cs
index ed66beb..751d3cd 100644
--- a/ToolPack1/ConfigurationTool/Serializer/BinarySerializer.cs
+++ b/ToolPack1/ConfigurationTool/Serializer/BinarySerializer.cs
@@ -11,32 +11,110 @@ namespace ConfigurationTool.Serializer
 {
     class BinarySerializer<T>
         : ISerializer<T>
+        where T : class, new()
     {
 
         public T Import(string file)
         {
-            // передаем в конструктор тип класса
-            BinaryFormatter formatter = new BinaryFormatter();
+            if (typeof(T).GetInterface("ICustomSerialazible") == null)
+            {
+                // передаем в конструктор тип класса
+                BinaryFormatter formatter = new BinaryFormatter();
 
-            // десериализация
-            using (FileStream fs = new FileStream(file, FileMode.Open))
+                // десериализация
+                using (FileStream fs = new FileStream(file, FileMode.Open))
+                {
+                    return (T)formatter.Deserialize(fs);
+                }
+            }
+            else
             {
-                return (T)formatter.Deserialize(fs);
+                ICustomSerialazible res = (ICustomSerialazible)new T();
+
+                // передаем в конструктор тип класса
+                BinaryFormatter formatter = new BinaryFormatter();
+
+                // десериализация
+                using (FileStream fs = new FileStream(file, FileMode.Open))
+                {
+                    res.Import(formatter.Deserialize(fs));
+                }
+
+                return (T)res;
             }
         }
 
         public void Export(T data, string file)
         {
-            // передаем в конструктор тип класса
-            BinaryFormatter formatter = new BinaryFormatter();
+            if (typeof(T).GetInterface("ICustomSerialazible") == null)
+            {
+                // передаем в конструктор тип класса
+                BinaryFormatter formatter = new BinaryFormatter();
 
-            // получаем поток, куда будем записывать сериализованный объект
-            using (FileStream fs = new FileStream(file, FileMode.Create))
+                // получаем поток, куда будем записывать сериализованный объект
+                using (FileStream fs = new FileStream(file, FileMode.Create))
+                {
+                    formatter.Serialize(fs, data);
+                }
+            }
+            else
             {
-                formatter.Serialize(fs, data);
+                ICustomSerialazible entity = (ICustomSerialazible)data;
+
+                // передаем в конструктор тип класса
+                BinaryFormatter formatter = new BinaryFormatter();
+
+                // получаем поток, куда будем записывать сериализованный объект
+                using (FileStream fs = new FileStream(file, FileMode.Create))
+                {
+                    formatter.Serialize(fs, entity.Export());
+                }
             }
         }
 
 
+        public T Import(Stream stream)
+        {
+            if (typeof(T).GetInterface("ICustomSerialazible") == null)
+            {
+                // передаем в конструктор тип класса
+                BinaryFormatter formatter = new BinaryFormatter();
+
+                // десериализация                
+                return (T)formatter.Deserialize(stream);
+            }
+            else
+            {
+                ICustomSerialazible res = (ICustomSerialazible)new T();
+
+                // передаем в конструктор тип класса
+                BinaryFormatter formatter = new BinaryFormatter();
+
+                // десериализация
+                res.Import(formatter.Deserialize(stream));
+
+                return (T)res;
+            }
+        }
+
+        public void Export(T data, Stream stream)
+        {
+            if (typeof(T).GetInterface("ICustomSerialazible") == null)
+            {
+                // передаем в конструктор тип класса
+                BinaryFormatter formatter = new BinaryFormatter();
+
+                formatter.Serialize(stream, data);
+            }
+            else
+            {
+                ICustomSerialazible entity = (ICustomSerialazible)data;
+
+                // передаем в конструктор тип класса
+                BinaryFormatter formatter = new BinaryFormatter();
+
+                formatter.Serialize(stream, entity.Export());
+            }
+        }
     }
 }
diff --git a/ToolPack1/ConfigurationTool/Serializer/ISerializer.cs b/ToolPack1/ConfigurationTool/Serializer/ISerializer.cs
index 63989f7..fd0c5cb 100644
--- a/ToolPack1/ConfigurationTool/Serializer/ISerializer.cs
+++ b/ToolPack1/ConfigurationTool/Serializer/ISerializer.cs
@@ -4,11 +4,16 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
+using System.IO;
+
 namespace ConfigurationTool.Serializer
 {
     interface ISerializer<T>
     {
         T Import(string file);
-        void Export(T data, string file);        
+        void Export(T data, string file);
+
+        T Import(Stream stream);
+        void Export(T data, Stream stream);
     }
 }
diff --git a/ToolPack1/ConfigurationTool/Serializer/XMLSerializer.cs b/ToolPack1/ConfigurationTool/Serializer/XMLSerializer.cs
index 798b214..4262c85 100644
--- a/ToolPack1/ConfigurationTool/Serializer/XMLSerializer.cs
+++ b/ToolPack1/ConfigurationTool/Serializer/XMLSerializer.cs
@@ -7,36 +7,118 @@ using System.Threading.Tasks;
 using System.IO;
 using System.Xml.Serialization;
 
+using ConfigurationTool;
+
 namespace ConfigurationTool.Serializer
 {
     class XMLSerializer<T>
         : ISerializer<T>
+        where T : class, new()
     {
-
         public T Import(string file)
         {
-            // передаем в конструктор тип класса
-            XmlSerializer formatter = new XmlSerializer(typeof(T));
+            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))
+                // десериализация
+                using (FileStream fs = new FileStream(file, FileMode.Open))
+                {
+                    return (T)formatter.Deserialize(fs);
+                }
+            }
+            else
             {
-                return (T)formatter.Deserialize(fs);
+                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)
         {
-            // передаем в конструктор тип класса
-            XmlSerializer formatter = new XmlSerializer(typeof(T));
+            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));
 
-            // получаем поток, куда будем записывать сериализованный объект
-            using (FileStream fs = new FileStream(file, FileMode.Create))
+                // десериализация
+                return (T)formatter.Deserialize(stream);
+            }
+            else
             {
-                formatter.Serialize(fs, data);
-            }            
+                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());
+            }
+        }
     }
 }
diff --git a/ToolPack1/Console/Config.xml b/ToolPack1/Console/Config.xml
index 04145d2..6422c49 100644
--- a/ToolPack1/Console/Config.xml
+++ b/ToolPack1/Console/Config.xml
@@ -1,5 +1,15 @@
 <?xml version="1.0"?>
-<ConfigData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <Name>Name</Name>
-  <ID>-10</ID>
-</ConfigData>
\ No newline at end of file
+<ConfigData_Serial xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>n</Name>
+  <ID>23</ID>
+  <dictionary>
+    <Item>
+      <Key>5</Key>
+      <Value>1</Value>
+    </Item>
+    <Item>
+      <Key>6</Key>
+      <Value>2</Value>
+    </Item>
+  </dictionary>
+</ConfigData_Serial>
\ No newline at end of file
diff --git a/ToolPack1/Console/Program.cs b/ToolPack1/Console/Program.cs
index efc76b2..0f64c35 100644
--- a/ToolPack1/Console/Program.cs
+++ b/ToolPack1/Console/Program.cs
@@ -7,11 +7,61 @@ using System.Threading.Tasks;
 using ConfigurationTool;
 
 namespace Console
-{
-    public class ConfigData
+{  
+    public class ConfigData : ICustomSerialazible
     {
+        public class ConfigData_Serial
+        {
+            public class Item
+            {
+                public int Key { set; get; }
+                public string Value { set; get; }
+            }
+
+            public string Name { set; get; }
+            public int ID { set; get; }
+
+
+            public List<Item> dictionary { set; get; }
+        }
+
         public string Name { set; get; } = "n";
         public int ID { set; get; } = 23;
+
+        public Dictionary<int, string> dictionary { set; get; } = new Dictionary<int, string>
+        {
+            [1]="1",
+            [2]="2"
+        };
+
+        public Type SerialazibleType => typeof(ConfigData_Serial);
+
+        public object Export()
+        => new ConfigData_Serial()
+            {
+                ID = ID,
+                Name = Name,
+                dictionary = dictionary
+                    .Select(e => 
+                        new ConfigData_Serial.Item()
+                        {
+                            Key = e.Key,
+                            Value = e.Value
+                        }
+                    )
+                .ToList()
+            };
+
+        public void Import(object obj)
+        {
+            ConfigData_Serial data = (ConfigData_Serial)obj;
+
+            ID = data.ID;
+            Name = data.Name;
+
+            dictionary = data.dictionary
+                .ToDictionary(e => e.Key, e2 => e2.Value);
+        }
     }
 
     class Program