ToolPack1
Changes
Build/ConfigurationTool.dll 0(+0 -0)
Build/ConfigurationTool.pdb 0(+0 -0)
ToolPack1/Console/Config.xml 18(+14 -4)
ToolPack1/Console/Program.cs 54(+52 -2)
Details
Build/ConfigurationTool.dll 0(+0 -0)
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
Build/ConfigurationTool.pdb 0(+0 -0)
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());
+ }
+ }
}
}
ToolPack1/Console/Config.xml 18(+14 -4)
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
ToolPack1/Console/Program.cs 54(+52 -2)
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