ToolPack1

Переработка RW_Tool: теперь есть 2 основных способа взаимодействия 1)

10/13/2019 10:21:47 PM

Changes

Build/Console.exe.config 6(+0 -6)

Build/Console.pdb 0(+0 -0)

ToolPack1/ConfigurationTool/CustomSerializer/BaseCustomSerialazible.cs 24(+0 -24)

ToolPack1/ConfigurationTool/CustomSerializer/ICustomSerialazible.cs 25(+0 -25)

ToolPack1/ConfigurationTool/Serializer/BinarySerializer.cs 43(+0 -43)

ToolPack1/ConfigurationTool/Serializer/ISerializer.cs 19(+0 -19)

ToolPack1/ConfigurationTool/Serializer/XMLSerializer.cs 40(+0 -40)

Details

diff --git a/Build/ConfigurationTool.dll b/Build/ConfigurationTool.dll
index 02dc7a5..188ce2b 100644
Binary files a/Build/ConfigurationTool.dll and b/Build/ConfigurationTool.dll differ
diff --git a/Build/ConfigurationTool.pdb b/Build/ConfigurationTool.pdb
index 364588b..afeebeb 100644
Binary files a/Build/ConfigurationTool.pdb and b/Build/ConfigurationTool.pdb differ
diff --git a/Build/RW_Tool.dll b/Build/RW_Tool.dll
index dfcfb8a..2897e0c 100644
Binary files a/Build/RW_Tool.dll and b/Build/RW_Tool.dll differ
diff --git a/Build/RW_Tool.pdb b/Build/RW_Tool.pdb
index fac0d9b..509478d 100644
Binary files a/Build/RW_Tool.pdb and b/Build/RW_Tool.pdb differ
diff --git a/ToolPack1/ConfigurationTool/Config/ConfigEntity.cs b/ToolPack1/ConfigurationTool/Config/ConfigEntity.cs
index fbb234d..17aa618 100644
--- a/ToolPack1/ConfigurationTool/Config/ConfigEntity.cs
+++ b/ToolPack1/ConfigurationTool/Config/ConfigEntity.cs
@@ -12,18 +12,20 @@ using RW_Tool.DataSource.FileOrStream;
 using ConfigurationTool.Serializer;
 using SingletonTool;
 
+using RW_Tool.Interface;
+
 namespace ConfigurationTool.Config
 {
     //Singlethon сущность конфига 
-    public class ConfigEntity<T>
+    internal class ConfigEntity<T>
         : ISignlethonWithParams<ConfigParams>
         where T : class, new()
     {
         //Параметры конфига
-        public ConfigParams Params { private set; get; }
+        internal ConfigParams Params { private set; get; }
 
         //Объект сериализации
-        private ISerializer<T> Serializer;
+        I_RWI<T, DS_FileOrStream> Serializer;
 
         //Данные, хранимые в конфиге
         public T Data { set; get; } = new T();
@@ -32,11 +34,8 @@ namespace ConfigurationTool.Config
         {
             Params = param;
 
-            switch (param.Format)
-            {
-                case EnumFormat.XML: Serializer = new XMLSerializer<T>(Params.ConfigPath); break;
-                case EnumFormat.Binary: Serializer = new BinarySerializer<T>(Params.ConfigPath); break;
-            }
+           Serializer = new SerializerFactory()
+                .GetSerializer<T>(Params.ConfigPath, param.Format);            
 
             if (File.Exists(Params.ConfigPath))
                 Import();
@@ -54,4 +53,5 @@ namespace ConfigurationTool.Config
             Serializer.Write(Data);
         }
     }
+
 }
diff --git a/ToolPack1/ConfigurationTool/Config/ConfigParams.cs b/ToolPack1/ConfigurationTool/Config/ConfigParams.cs
index 8b462dc..3791b06 100644
--- a/ToolPack1/ConfigurationTool/Config/ConfigParams.cs
+++ b/ToolPack1/ConfigurationTool/Config/ConfigParams.cs
@@ -7,6 +7,8 @@ using System.Threading.Tasks;
 using System.IO;
 using System.Windows.Forms;
 
+using RW_Tool.Interface.Custom;
+
 namespace ConfigurationTool.Config
 {    
     //Базовые параметры конфига
@@ -28,5 +30,11 @@ namespace ConfigurationTool.Config
              ConfigFile
             );
 
+
+        public ConfigParams(string ConfigFile)
+        {
+            this.ConfigFile = ConfigFile;
+        }
     }
+
 }
diff --git a/ToolPack1/ConfigurationTool/Config/ConfigurationManager.cs b/ToolPack1/ConfigurationTool/Config/ConfigurationManager.cs
index 8e0ac98..466aff9 100644
--- a/ToolPack1/ConfigurationTool/Config/ConfigurationManager.cs
+++ b/ToolPack1/ConfigurationTool/Config/ConfigurationManager.cs
@@ -56,4 +56,5 @@ namespace ConfigurationTool.Config
                 File.Delete(Config.Params.ConfigPath);
         }
     }
+
 }
diff --git a/ToolPack1/ConfigurationTool/Config/Custom/ConfigEntity.cs b/ToolPack1/ConfigurationTool/Config/Custom/ConfigEntity.cs
new file mode 100644
index 0000000..4ca4815
--- /dev/null
+++ b/ToolPack1/ConfigurationTool/Config/Custom/ConfigEntity.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using System.IO;
+
+using RW_Tool;
+using RW_Tool.DataSource.FileOrStream;
+
+using ConfigurationTool.Serializer;
+using SingletonTool;
+
+using RW_Tool.Interface;
+
+using ConfigurationTool.Config;
+
+namespace ConfigurationTool.Config.Custom
+{
+
+    internal class ConfigEntity<T1, T2>
+        : ISignlethonWithParams<ConfigParams<T1, T2>>
+        where T1 : class, new()
+        where T2 : class, new()
+    {
+        //Параметры конфига
+        public ConfigParams<T1, T2> Params { private set; get; }
+
+        //Объект сериализации
+        I_RWI<T1, DS_FileOrStream> Serializer;
+
+
+        //Данные, хранимые в конфиге
+        public T1 Data { set; get; } = new T1();
+
+        public void SetParams(ConfigParams<T1, T2> param)
+        {
+            Params = param;
+
+            Serializer = new SerializerFactory()
+               .GetSerializer_Custon<T1, T2>(
+               param.ConfigPath,
+               param.Format,
+               param.Transformator
+               );
+
+            if (File.Exists(Params.ConfigPath))
+                Import();
+            Export();
+        }
+
+        //Прочитать файл
+        public void Import()
+        {
+            Data = Serializer.Read();
+        }
+        //Сохранить в файл
+        public void Export()
+        {
+            Serializer.Write(Data);
+        }
+    }
+
+}
diff --git a/ToolPack1/ConfigurationTool/Config/Custom/ConfigParams.cs b/ToolPack1/ConfigurationTool/Config/Custom/ConfigParams.cs
new file mode 100644
index 0000000..f79a5a9
--- /dev/null
+++ b/ToolPack1/ConfigurationTool/Config/Custom/ConfigParams.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using System.IO;
+using System.Windows.Forms;
+
+using RW_Tool.Interface.Custom;
+
+namespace ConfigurationTool.Config.Custom
+{    
+    public class ConfigParams<T1, T2>
+    {
+        //Имя или полный путь к файлу конфигурации
+        public string ConfigFile { set; get; }
+        //Флаг: испоьзовать ли в пути к файлу путь к .exe приложению
+        public bool UseApplicationPathPrefix { set; get; } = true;
+
+        //Формат в котором будет храниться конфиг
+        public EnumFormat Format { set; get; } = EnumFormat.XML;
+
+        //Трансформатор для преобразования формата из T1 в T2
+        public ITransformator<T1, T2> Transformator { set; get; }
+
+        //Путь по которому выполняются обращению к конфигу
+        public string ConfigPath => (UseApplicationPathPrefix
+            ?
+             Path.Combine(Application.StartupPath, ConfigFile)
+            :
+             ConfigFile
+            );
+
+
+        public ConfigParams(string ConfigFile, ITransformator<T1, T2> Transformator)
+        {
+            this.ConfigFile = ConfigFile;
+            this.Transformator = Transformator;
+        }
+    }
+}
diff --git a/ToolPack1/ConfigurationTool/Config/Custom/ConfigurationManager.cs b/ToolPack1/ConfigurationTool/Config/Custom/ConfigurationManager.cs
new file mode 100644
index 0000000..f642526
--- /dev/null
+++ b/ToolPack1/ConfigurationTool/Config/Custom/ConfigurationManager.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using System.IO;
+
+using SingletonTool;
+
+namespace ConfigurationTool.Config.Custom
+{      
+    //Обеспечивате доступ к конфигу
+    public sealed class ConfigurationManager<T1, T2>
+        where T1: class, new()
+        where T2 : class, new()
+    {
+        //Конфиг
+        private ConfigEntity<T1, T2> Config => SignlethonWithParams<ConfigEntity<T1, T2>, ConfigParams<T1, T2>>.Get();
+        //Данные конфига
+        public T1 Data
+        {
+            set => Config.Data = value;
+            get => Config.Data;
+        }
+
+        //При первом обращении необходимо использовать данный конструктор для иницилизации параметров конфига
+        public ConfigurationManager(ConfigParams<T1,T2> param)
+        {
+            if (!SignlethonWithParams<ConfigEntity<T1,T2>, ConfigParams<T1,T2>>.ExistInstance)
+                SignlethonWithParams<ConfigEntity<T1,T2>, ConfigParams<T1, T2>>.Create(param);
+        }
+
+        //Для повторных обращений к конфигу
+        public ConfigurationManager()
+        {
+            if (!SignlethonWithParams<ConfigEntity<T1>, ConfigParams>.ExistInstance)
+                throw new Exception("Use ConfigurationManager(ConfigParams param) first");
+        }
+
+
+        //Прочитать из файла
+        public void Import()
+        {
+            Config.Import();
+        }
+        //Сохранить в файл
+        public void Export()
+        {
+            Config.Export();
+        }
+
+        public bool Exist() => File.Exists(Config.Params.ConfigPath);
+        public void Delete()
+        {
+            if (Exist())
+                File.Delete(Config.Params.ConfigPath);
+        }
+    }
+}
diff --git a/ToolPack1/ConfigurationTool/ConfigMultiple/Custom/MConfigEntity.cs b/ToolPack1/ConfigurationTool/ConfigMultiple/Custom/MConfigEntity.cs
new file mode 100644
index 0000000..9d457dd
--- /dev/null
+++ b/ToolPack1/ConfigurationTool/ConfigMultiple/Custom/MConfigEntity.cs
@@ -0,0 +1,105 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using System.IO;
+
+using RW_Tool;
+using RW_Tool.Interface;
+using RW_Tool.DataSource.FileOrStream;
+
+using ConfigurationTool.Serializer;
+using SingletonTool;
+
+namespace ConfigurationTool.ConfigMultiple.Custom
+{
+    //Singlethon сущность конфига 
+    public class MConfigEntity<T1, T2>
+        : ISignlethonWithParams<MConfigParams<T1,T2>>
+        where T1 : class, new()
+        where T2 : class, new()
+    {
+        //Параметры конфига
+        public MConfigParams<T1,T2> Params { private set; get; }
+
+        //Объект сериализации
+        I_RWI<T1, DS_FileOrStream> Serializer;
+
+        //Данные, хранимые в конфиге
+        public Dictionary<string, T1> Data { set; get; } = new Dictionary<string, T1>();
+
+
+        public void SetParams(MConfigParams<T1,T2> param)           
+        {
+            Params = param;
+
+            Serializer = new SerializerFactory()
+                .GetSerializer_Custon<T1,T2>(
+                Params.ConfigDirectoryPath, 
+                param.Format, 
+                param.Transformator
+                );
+
+
+
+            if (Directory.Exists(Params.ConfigDirectoryPath))
+                ImportAll();
+            ExportAll();
+        }
+
+
+
+
+
+        public void Export(string key)
+        {
+            Serializer.Write(
+                Data[key], 
+                new DS_File(Params.GetPathForFile(key))
+            );
+        }
+        public void ExportAll()
+        {
+            DirectoryInfo dir = Params.ConfigDirectoryInfo;
+
+            if (Params.RecreateDirectory)
+            {
+                if (dir.Exists)
+                    dir.Delete(true);
+            }
+            dir.Refresh();
+            if (!dir.Exists)
+                dir.Create();
+
+            foreach (var elem in Data)
+                Export(elem.Key);
+        }
+
+        public void Import(string path)
+        {
+            Data.Add(
+                Path.GetFileNameWithoutExtension(Path.GetFileName(path)),
+                Serializer.Read(new DS_File(path))
+            );
+        }
+        public void ImportAll()
+        {
+            DirectoryInfo dir = Params.ConfigDirectoryInfo;
+
+            if (!dir.Exists)
+            {
+                dir.Create();
+                return;
+            }
+
+            var data = dir.GetFiles();
+
+            foreach (var elem in data)
+            {
+                Import(elem.FullName);
+            }
+        }
+    }
+}
diff --git a/ToolPack1/ConfigurationTool/ConfigMultiple/Custom/MConfigParams.cs b/ToolPack1/ConfigurationTool/ConfigMultiple/Custom/MConfigParams.cs
new file mode 100644
index 0000000..5b6bf52
--- /dev/null
+++ b/ToolPack1/ConfigurationTool/ConfigMultiple/Custom/MConfigParams.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using System.IO;
+using System.Windows.Forms;
+
+using RW_Tool.Interface.Custom;
+
+namespace ConfigurationTool.ConfigMultiple.Custom
+{
+    //Базовые параметры конфига
+    public class MConfigParams<T1,T2>
+    {
+        //Папка, в которой будут храниться конфиги
+        public string ConfigDirectory { set; get; }
+        //Флаг: испоьзовать ли в пути к файлу путь к .exe приложению
+        public bool UseApplicationPathPrefix { set; get; } = true;
+
+        //Формат в котором будет храниться конфиг
+        public EnumFormat Format { set; get; } = EnumFormat.XML;
+
+        public ITransformator<T1, T2> Transformator { set; get; }
+
+        //Пересоздавать папку при общем сохранении
+        public bool RecreateDirectory { set; get; } = true;
+
+        //Полный путь к конфигу
+        public string ConfigDirectoryPath => (UseApplicationPathPrefix
+            ?
+             Path.Combine(Application.StartupPath, ConfigDirectory)
+            :
+             ConfigDirectory
+            );
+        public DirectoryInfo ConfigDirectoryInfo => new DirectoryInfo(ConfigDirectoryPath);
+
+        public string GetPathForFile(string key) =>        
+             Path.Combine(ConfigDirectoryPath, key + 
+                (Format == EnumFormat.XML ? ".xml" : ".bin")
+                );
+
+
+        public MConfigParams(string ConfigDirectory, ITransformator<T1, T2> Transformator)
+        {
+            this.ConfigDirectory = ConfigDirectory;
+            this.Transformator = Transformator;
+        }
+    }
+}
diff --git a/ToolPack1/ConfigurationTool/ConfigMultiple/Custom/MConfigurationManager.cs b/ToolPack1/ConfigurationTool/ConfigMultiple/Custom/MConfigurationManager.cs
new file mode 100644
index 0000000..0b0e556
--- /dev/null
+++ b/ToolPack1/ConfigurationTool/ConfigMultiple/Custom/MConfigurationManager.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using System.IO;
+
+using SingletonTool;
+
+namespace ConfigurationTool.ConfigMultiple.Custom
+{      
+    //Обеспечивате доступ к конфигу
+    public sealed class MConfigurationManager<T1, T2>
+        where T1: class, new()
+        where T2 : class, new()
+    {
+        //Конфиг
+        private MConfigEntity<T1, T2> Config => SignlethonWithParams<MConfigEntity<T1, T2>, MConfigParams<T1, T2>>.Get();
+        //Данные конфига
+        public Dictionary<string, T1> Data
+        {
+            set => Config.Data = value;
+            get => Config.Data;
+        }
+
+        //При первом обращении необходимо использовать данный конструктор для иницилизации параметров конфига
+        public MConfigurationManager(MConfigParams<T1, T2> param)
+        {
+            if (!SignlethonWithParams<MConfigEntity<T1,T2>, MConfigParams<T1,T2>>.ExistInstance)
+                SignlethonWithParams<MConfigEntity<T1, T2>, MConfigParams<T1, T2>>.Create(param);
+        }
+
+        //Для повторных обращений к конфигу
+        public MConfigurationManager()
+        {
+            if (!SignlethonWithParams<MConfigEntity<T1, T2>, MConfigParams<T1, T2>>.ExistInstance)
+                throw new Exception("Use ConfigurationManager(ConfigParams param) first");
+        }
+
+
+        public void Add(string key, T1 value)
+        {
+            Data.Add(key, value);
+            Config.Export(key);
+        }
+        public void Remove(string key)
+        {
+            Data.Remove(key);
+            var path = Config.Params.GetPathForFile(key);
+            if (File.Exists(path))
+                File.Delete(path);
+        }
+
+        //Прочитать из файла
+        public void Import()
+        {
+            Config.ImportAll();
+        }
+        //Сохранить в файл
+        public void Export()
+        {
+            Config.ExportAll();
+        }
+
+        public void Delete()
+        {
+            var dir = Config.Params.ConfigDirectoryInfo;
+
+            if (dir.Exists)
+                dir.Delete(true);
+        }
+    }
+}
diff --git a/ToolPack1/ConfigurationTool/ConfigMultiple/MConfigEntity.cs b/ToolPack1/ConfigurationTool/ConfigMultiple/MConfigEntity.cs
index 5baf70b..380d839 100644
--- a/ToolPack1/ConfigurationTool/ConfigMultiple/MConfigEntity.cs
+++ b/ToolPack1/ConfigurationTool/ConfigMultiple/MConfigEntity.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
 
 using System.IO;
 
-using RW_Tool;
+using RW_Tool.Interface;
 using RW_Tool.DataSource.FileOrStream;
 
 using ConfigurationTool.Serializer;
@@ -23,7 +23,7 @@ namespace ConfigurationTool.ConfigMultiple
         public MConfigParams Params { private set; get; }
 
         //Объект сериализации
-        private ISerializer<T> Serializer;
+        I_RWI<T, DS_FileOrStream> Serializer;
 
         //Данные, хранимые в конфиге
         public Dictionary<string, T> Data { set; get; } = new Dictionary<string, T>();
@@ -33,11 +33,11 @@ namespace ConfigurationTool.ConfigMultiple
         {
             Params = param;
 
-            switch (param.Format)
-            {
-                case EnumFormat.XML: Serializer = new XMLSerializer<T>(Params.ConfigDirectoryPath); break;
-                case EnumFormat.Binary: Serializer = new BinarySerializer<T>(Params.ConfigDirectoryPath); break;
-            }
+            Serializer = new SerializerFactory()
+                .GetSerializer<T>(
+                    param.ConfigDirectoryPath, 
+                    param.Format
+                );
 
             if (Directory.Exists(Params.ConfigDirectoryPath))
                 ImportAll();
@@ -45,14 +45,11 @@ namespace ConfigurationTool.ConfigMultiple
         }
 
 
-
-
-
         public void Export(string key)
         {
-            Serializer.Writer.Write(
+            Serializer.Write(
                 Data[key], 
-                new DS_File() { FilePath = Params.GetPathForFile(key) }
+                new DS_File(Params.GetPathForFile(key))
             );
         }
         public void ExportAll()
@@ -76,8 +73,8 @@ namespace ConfigurationTool.ConfigMultiple
         {
             Data.Add(
                 Path.GetFileNameWithoutExtension(Path.GetFileName(path)),
-                Serializer.Reader.Read(new DS_File() { FilePath = path})
-                );
+                Serializer.Read(new DS_File(path))
+            );
         }
         public void ImportAll()
         {
diff --git a/ToolPack1/ConfigurationTool/ConfigurationTool.csproj b/ToolPack1/ConfigurationTool/ConfigurationTool.csproj
index 5e06b78..b913bf0 100644
--- a/ToolPack1/ConfigurationTool/ConfigurationTool.csproj
+++ b/ToolPack1/ConfigurationTool/ConfigurationTool.csproj
@@ -43,23 +43,25 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ConfigMultiple\MConfigParams.cs" />
+    <Compile Include="ConfigMultiple\Custom\MConfigParams.cs" />
+    <Compile Include="ConfigMultiple\Custom\MConfigEntity.cs" />
+    <Compile Include="ConfigMultiple\Custom\MConfigurationManager.cs" />
     <Compile Include="ConfigMultiple\MConfigEntity.cs" />
-    <Compile Include="ConfigMultiple\ConfigParams.cs" />
     <Compile Include="ConfigMultiple\MConfigurationManager.cs" />
-    <Compile Include="CustomSerializer\BaseCustomSerialazible.cs" />
     <Compile Include="Config\ConfigEntity.cs" />
     <Compile Include="Config\ConfigParams.cs" />
     <Compile Include="Config\ConfigurationManager.cs" />
-    <Compile Include="CustomSerializer\ICustomSerialazible.cs" />
+    <Compile Include="Config\Custom\ConfigEntity.cs" />
+    <Compile Include="Config\Custom\ConfigParams.cs" />
+    <Compile Include="Config\Custom\ConfigurationManager.cs" />
     <Compile Include="EnumFormat.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="RW\Bin\Bin_Reader.cs" />
-    <Compile Include="RW\Bin\Bin_Writer.cs" />
-    <Compile Include="RW\XML\XML_Reader.cs" />
-    <Compile Include="RW\XML\XML_Writer.cs" />
-    <Compile Include="Serializer\BinarySerializer.cs" />
-    <Compile Include="Serializer\ISerializer.cs" />
-    <Compile Include="Serializer\XMLSerializer.cs" />
+    <Compile Include="Serializer\Bin\Bin_Reader.cs" />
+    <Compile Include="Serializer\Bin\Bin_Writer.cs" />
+    <Compile Include="Serializer\XML\XML_Reader.cs" />
+    <Compile Include="Serializer\XML\XML_Writer.cs" />
+    <Compile Include="Serializer\SerializerFactory.cs" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\RW_Tool\RW_Tool.csproj">
diff --git a/ToolPack1/ConfigurationTool/ConfigurationTool.csproj.user b/ToolPack1/ConfigurationTool/ConfigurationTool.csproj.user
new file mode 100644
index 0000000..6cbe588
--- /dev/null
+++ b/ToolPack1/ConfigurationTool/ConfigurationTool.csproj.user
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ProjectFiles</ProjectView>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/ToolPack1/ConfigurationTool/Serializer/SerializerFactory.cs b/ToolPack1/ConfigurationTool/Serializer/SerializerFactory.cs
new file mode 100644
index 0000000..c104cb2
--- /dev/null
+++ b/ToolPack1/ConfigurationTool/Serializer/SerializerFactory.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using RW_Tool;
+using RW_Tool.Interface;
+using RW_Tool.Interface.Custom;
+using RW_Tool.DataSource.FileOrStream;
+
+using ConfigurationTool.Serializer.XML;
+using ConfigurationTool.Serializer.Bin;
+
+namespace ConfigurationTool.Serializer
+{
+    internal class SerializerFactory       
+    {
+        public I_RWI<T, DS_FileOrStream> GetSerializer<T>(string file, EnumFormat format)
+            where T : class, new()
+        {
+            switch (format)
+            {
+                case EnumFormat.XML:
+                    return new RWI<T, DS_FileOrStream>(
+                        new DS_File(file),
+                        new XML_Reader<T>(),
+                        new XML_Writer<T>()
+                    );
+
+                case EnumFormat.Binary:
+                    return new RWI<T, DS_FileOrStream>(
+                        new DS_File(file),
+                        new Bin_Reader<T>(),
+                        new Bin_Writer<T>()
+                    );
+            }
+
+            throw new Exception();
+        }
+        public I_RWI<T1, DS_FileOrStream> GetSerializer_Custon<T1,T3>(string file, EnumFormat format, ITransformator<T1,T3> transformator)
+            where T1: class, new()
+            where T3: class, new()
+        {
+            switch (format)
+            {
+                case EnumFormat.XML:
+                    return new RWI_Custom<T1, DS_FileOrStream, T3>(
+                        new DS_File(file),
+                        transformator,
+                        new XML_Reader<T3>(),
+                        new XML_Writer<T3>()
+                    );
+
+                case EnumFormat.Binary:
+                    return new RWI_Custom<T1, DS_FileOrStream, T3>(
+                        new DS_File(file),
+                        transformator,
+                        new Bin_Reader<T3>(),
+                        new Bin_Writer<T3>()
+                    );
+            }
+
+            throw new Exception();
+        }
+
+    }
+}
diff --git a/ToolPack1/Console/Program.cs b/ToolPack1/Console/Program.cs
index 6bfec1a..0cb0e5c 100644
--- a/ToolPack1/Console/Program.cs
+++ b/ToolPack1/Console/Program.cs
@@ -7,7 +7,6 @@ using System.Threading.Tasks;
 using ConfigurationTool;
 using ConfigurationTool.Config;
 using ConfigurationTool.ConfigMultiple;
-using ConfigurationTool.CustomSerializer;
 
 namespace Console
 {
diff --git a/ToolPack1/RW_Tool/DataSource/DS_Base.cs b/ToolPack1/RW_Tool/DataSource/DS_Base.cs
index 690012d..9f9a41d 100644
--- a/ToolPack1/RW_Tool/DataSource/DS_Base.cs
+++ b/ToolPack1/RW_Tool/DataSource/DS_Base.cs
@@ -5,6 +5,10 @@ using System.Text;
 
 namespace RW_Tool.DataSource
 {
+    /// <summary>
+    /// Базовый класс для типов хранилиз данных.
+    /// Описывает данные необходимые для работы с хранилищем
+    /// </summary>
     public abstract class DS_Base
     {
         public abstract string Type {get;}
diff --git a/ToolPack1/RW_Tool/DataSource/FileOrStream/DS_File.cs b/ToolPack1/RW_Tool/DataSource/FileOrStream/DS_File.cs
new file mode 100644
index 0000000..ccd297b
--- /dev/null
+++ b/ToolPack1/RW_Tool/DataSource/FileOrStream/DS_File.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using System.IO;
+
+namespace RW_Tool.DataSource.FileOrStream
+{
+    public class DS_File : DS_FileOrStream
+    {
+        public override string Type => "File";
+
+        public string FilePath { set; get; }
+        public FileInfo FileInfo => new FileInfo(FilePath);
+
+
+        public DS_File() { }
+        public DS_File(string FilePath)
+        {
+            this.FilePath = FilePath;
+        }
+    }
+}
diff --git a/ToolPack1/RW_Tool/DataSource/FileOrStream/DS_Stream.cs b/ToolPack1/RW_Tool/DataSource/FileOrStream/DS_Stream.cs
new file mode 100644
index 0000000..7402784
--- /dev/null
+++ b/ToolPack1/RW_Tool/DataSource/FileOrStream/DS_Stream.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using System.IO;
+
+namespace RW_Tool.DataSource.FileOrStream
+{
+    public class DS_Stream : DS_FileOrStream
+    {
+        public override string Type => "Stream";
+
+        public Stream Stream { set; get; }
+
+        public DS_Stream() { }
+        public DS_Stream(Stream stream)
+        {
+            this.Stream = stream;
+        }
+    }
+}
diff --git a/ToolPack1/RW_Tool/DataSource/FileOrStream/FileOrStream.cs b/ToolPack1/RW_Tool/DataSource/FileOrStream/FileOrStream.cs
index 3845366..8771a23 100644
--- a/ToolPack1/RW_Tool/DataSource/FileOrStream/FileOrStream.cs
+++ b/ToolPack1/RW_Tool/DataSource/FileOrStream/FileOrStream.cs
@@ -3,12 +3,11 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
-using System.IO;
-
-using RW_Tool.DataSource;
-
 namespace RW_Tool.DataSource.FileOrStream
 {
+    /// <summary>
+    /// Используется для обозначения источника данных в виде файл(полный путь) или стрим
+    /// </summary>
     public abstract class DS_FileOrStream : DS_Base
     {
         public DS_File AsFile => (DS_File)this;
@@ -16,19 +15,6 @@ namespace RW_Tool.DataSource.FileOrStream
 
         public DS_Stream AsStream => (DS_Stream)this;
         public bool IsStream => this is DS_Stream;
-    }
-
-    public class DS_File: DS_FileOrStream
-    {
-        public override string Type => "File";
-
-        public string FilePath { set; get; }
-        public FileInfo FileInfo => new FileInfo(FilePath);
-    }
-    public class DS_Stream: DS_FileOrStream
-    {
-        public override string Type => "Stream";
-
-        public Stream Stream { set; get; }        
-    }
+    }  
+    
 }
diff --git a/ToolPack1/RW_Tool/Interface/Custom/ITransformator.cs b/ToolPack1/RW_Tool/Interface/Custom/ITransformator.cs
new file mode 100644
index 0000000..9131d88
--- /dev/null
+++ b/ToolPack1/RW_Tool/Interface/Custom/ITransformator.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace RW_Tool.Interface.Custom
+{
+    /// <summary>
+    /// Интерфейс описывает класс, используемый для конвертации сущностей
+    /// </summary>
+    /// <typeparam name="T1">Тип 1 сущности</typeparam>
+    /// <typeparam name="T2">Тип 2 сущности</typeparam>
+    public interface ITransformator<T1, T2>
+    {
+        T1 ToEntityT1(T2 entity);
+        T2 ToEntityT2(T1 entity);
+    }
+}
diff --git a/ToolPack1/RW_Tool/RW_Tool.csproj b/ToolPack1/RW_Tool/RW_Tool.csproj
index f6b1d46..5ed718e 100644
--- a/ToolPack1/RW_Tool/RW_Tool.csproj
+++ b/ToolPack1/RW_Tool/RW_Tool.csproj
@@ -44,13 +44,17 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="DataSource\FileOrStream\DS_File.cs" />
+    <Compile Include="DataSource\FileOrStream\DS_Stream.cs" />
+    <Compile Include="Interface\Custom\ITransformator.cs" />
+    <Compile Include="Interface\I_RWI.cs" />
     <Compile Include="RWI.cs" />
     <Compile Include="DataSource\DS_Base.cs" />
     <Compile Include="DataSource\FileOrStream\FileOrStream.cs" />
-    <Compile Include="Interface\IImporter.cs" />
-    <Compile Include="Interface\IReader.cs" />
-    <Compile Include="Interface\IWriter.cs" />
+    <Compile Include="Interface\Actions\IReader.cs" />
+    <Compile Include="Interface\Actions\IWriter.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RWI_Custom.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>
\ No newline at end of file
diff --git a/ToolPack1/RW_Tool/RWI.cs b/ToolPack1/RW_Tool/RWI.cs
index e1baef1..8f34914 100644
--- a/ToolPack1/RW_Tool/RWI.cs
+++ b/ToolPack1/RW_Tool/RWI.cs
@@ -4,26 +4,67 @@ using System.Linq;
 using System.Text;
 
 using RW_Tool.Interface;
+using RW_Tool.Interface.Actions;
 
 namespace RW_Tool
 {
-    public class RWI<T1,T2>
+    /// <summary>
+    /// Обертка для чтения/записи какой либо сущности в какое либо хранилище
+    /// </summary>
+    /// <typeparam name="T1">Сущность</typeparam>
+    /// <typeparam name="T2">Набор параметров</typeparam>
+    public class RWI<T1,T2> :
+        I_RWI<T1, T2>
     {
         public T2 DataStorage { protected set; get; }
+        public bool HaveDataStorage => DataStorage != null;
 
-        public IReader<T1, T2> Reader { protected set; get; }
+        public readonly IReader<T1, T2> Reader;
         public bool HaveReader => Reader != null;
 
-        public IWriter<T1, T2> Writer { protected set; get; }
+        public readonly IWriter<T1, T2> Writer;
         public bool HaveWriter => Writer != null;
 
-        public IImporter<T1, T2> Importer { protected set; get; }
-        public bool HaveImporter => Importer != null;
 
-
-        public RWI(T2 ds)
+        public RWI(
+            IReader<T1, T2> Reader,
+            IWriter<T1, T2> Writer
+            )
+        {
+            this.Reader = Reader;
+            this.Writer = Writer;
+        }
+        public RWI(
+            T2 ds, 
+            IReader<T1, T2> Reader, 
+            IWriter<T1, T2> Writer
+            )
         {
             this.DataStorage = ds;
+            this.Reader = Reader;
+            this.Writer = Writer;
+        }
+
+
+        public T1 Read(T2 param)
+        {
+            if (!HaveReader)
+                throw new Exception();            
+
+            return Reader.Read(param);
         }
+        public T1 Read() => Read(DataStorage);
+
+        public void Write(T1 entity, T2 param)
+        {
+            if (!HaveWriter)
+                throw new Exception();
+
+            Writer.Write(entity, param);
+        }
+        public void Write(T1 entity) => Write(entity, DataStorage);
+
     }
+
+
 }
diff --git a/ToolPack1/RW_Tool/RWI_Custom.cs b/ToolPack1/RW_Tool/RWI_Custom.cs
new file mode 100644
index 0000000..e79a64e
--- /dev/null
+++ b/ToolPack1/RW_Tool/RWI_Custom.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using RW_Tool.Interface;
+using RW_Tool.Interface.Actions;
+using RW_Tool.Interface.Custom;
+
+namespace RW_Tool
+{
+    /// <summary>
+    /// Обертка для чтения/записи какой либо сущности в какое либо хранилище
+    /// с использованием промежуточной сущности T3
+    /// </summary>
+    /// <typeparam name="T1">Тип сущности</typeparam>
+    /// <typeparam name="T2">Параметры</typeparam>
+    /// <typeparam name="T3">Тип сериализуемой сущности</typeparam>
+    public class RWI_Custom<T1,T2,T3>:
+        I_RWI<T1, T2>
+        where T3 : new()
+    {
+        public T2 DataStorage { protected set; get; }
+        public bool HaveDataStorage => DataStorage != null;
+
+        public ITransformator<T1, T3> Transformator { protected set; get; }
+
+
+        public readonly IReader<T3, T2> Reader;
+        public bool HaveReader => Reader != null;
+
+        public readonly IWriter<T3, T2> Writer;
+        public bool HaveWriter => Writer != null;
+
+
+
+        public RWI_Custom(
+            ITransformator<T1, T3> Transformator,
+            IReader<T3, T2> Reader,
+            IWriter<T3, T2> Writer
+            )
+        {
+            this.Transformator = Transformator;
+            this.Reader = Reader;
+            this.Writer = Writer;
+        }
+        public RWI_Custom(
+            T2 ds,
+            ITransformator<T1, T3> Transformator,
+            IReader<T3, T2> Reader,
+            IWriter<T3, T2> Writer
+            )
+        {
+            DataStorage = ds;
+            this.Transformator = Transformator;
+            this.Reader = Reader;
+            this.Writer = Writer;
+        }
+
+
+        public T1 Read(T2 param)
+        {
+            if (!HaveReader)
+                throw new Exception();
+
+            T3 serial_entity = Reader.Read(param);
+            return Transformator.ToEntityT1(serial_entity);            
+        }
+        public T1 Read() => Read(DataStorage);
+
+        public void Write(T1 entity, T2 param)
+        {
+            if (!HaveWriter)
+                throw new Exception();
+
+            T3 serial_entity = Transformator.ToEntityT2(entity);
+            Writer.Write(serial_entity, param);             
+        }
+        public void Write(T1 entity) => Write(entity, DataStorage);
+    }
+}
diff --git a/ToolPack1/Test_ConfigurationTool/ConfigurationTest.cs b/ToolPack1/Test_ConfigurationTool/ConfigurationTest.cs
index 80ec576..10685b9 100644
--- a/ToolPack1/Test_ConfigurationTool/ConfigurationTest.cs
+++ b/ToolPack1/Test_ConfigurationTool/ConfigurationTest.cs
@@ -3,6 +3,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
 
 using ConfigurationTool;
 using ConfigurationTool.Config;
+using ConfigurationTool.Config.Custom;
 using ConfigurationTool.ConfigMultiple;
 
 using Test_ConfigurationTool.Entities;
@@ -20,9 +21,8 @@ namespace Test_ConfigurationTool
         {
             string file = @"Config.xml";
 
-            var conf = new ConfigurationManager<Config1>(new ConfigParams()
+            var conf = new ConfigurationManager<Config1>(new ConfigParams(file)
             {
-                ConfigFile = file,
                 Format = EnumFormat.XML,
                 UseApplicationPathPrefix = false
             });
@@ -47,9 +47,9 @@ namespace Test_ConfigurationTool
         {
             string file = @"Config2.xml";
 
-            var conf = new ConfigurationManager<Config2>(new ConfigParams()
+            var conf = new ConfigurationManager<Config2, Config2_Serial>(
+                new ConfigParams<Config2, Config2_Serial>(file, new Config2.Transformator())
             {
-                ConfigFile = file,
                 Format = EnumFormat.XML,
                 UseApplicationPathPrefix = false
             });
@@ -74,9 +74,8 @@ namespace Test_ConfigurationTool
         [TestMethod]
         public void Test3()
         {
-            var conf = new MConfigurationManager<Config3>(new MConfigParams()
+            var conf = new MConfigurationManager<Config3>(new MConfigParams("Configs3")
             {
-                ConfigDirectory = "Configs3",
                 Format = EnumFormat.XML,
                 UseApplicationPathPrefix = false
             });
diff --git a/ToolPack1/Test_ConfigurationTool/Entities/Config2.cs b/ToolPack1/Test_ConfigurationTool/Entities/Config2.cs
index 8f01b6b..852a526 100644
--- a/ToolPack1/Test_ConfigurationTool/Entities/Config2.cs
+++ b/ToolPack1/Test_ConfigurationTool/Entities/Config2.cs
@@ -4,7 +4,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-using ConfigurationTool.CustomSerializer;
+using RW_Tool.Interface.Custom;
 
 namespace Test_ConfigurationTool.Entities
 {
@@ -16,25 +16,33 @@ namespace Test_ConfigurationTool.Entities
     }
 
 
-    public class Config2 : BaseCustomSerialazible<Config2_Serial>
+    public class Config2
     {
-        public Dictionary<int, SubEntity> Dictionary { set; get; } 
-            = new Dictionary<int, SubEntity>();
-
-        public override Config2_Serial Export()
-            => new Config2_Serial()
+        public class Transformator : ITransformator<Config2, Config2_Serial>
+        {
+            public Config2 ToEntityT1(Config2_Serial entity)
+            {
+                return new Config2()
+                {
+                    Dictionary = entity
+                        .Dictionary
+                        .ToDictionary(e => e.ID)
+                };
+            }
+
+            public Config2_Serial ToEntityT2(Config2 entity)
             {
-                Dictionary = Dictionary
+                return new Config2_Serial()
+                {
+                    Dictionary = entity.Dictionary
                     .Values
                     .ToList()
-            };
-
-        public override void Import(Config2_Serial obj)
-        {
-            Dictionary = obj
-                .Dictionary
-                .ToDictionary(e => e.ID);
+                };
+            }
         }
+
+        public Dictionary<int, SubEntity> Dictionary { set; get; } 
+            = new Dictionary<int, SubEntity>();
     }
 
     public class Config2_Serial
diff --git a/ToolPack1/Test_ConfigurationTool/Test_ConfigurationTool.csproj b/ToolPack1/Test_ConfigurationTool/Test_ConfigurationTool.csproj
index 5cae744..c3860eb 100644
--- a/ToolPack1/Test_ConfigurationTool/Test_ConfigurationTool.csproj
+++ b/ToolPack1/Test_ConfigurationTool/Test_ConfigurationTool.csproj
@@ -63,6 +63,10 @@
       <Project>{e8a983a0-ff7d-4e9a-9234-3f19ccb93700}</Project>
       <Name>ConfigurationTool</Name>
     </ProjectReference>
+    <ProjectReference Include="..\RW_Tool\RW_Tool.csproj">
+      <Project>{78207c90-5cfa-4ded-a047-cf711cba3f86}</Project>
+      <Name>RW_Tool</Name>
+    </ProjectReference>
   </ItemGroup>
   <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />