20240326
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
// ReSharper disable MemberCanBePrivate.Global
|
||||
// ReSharper disable UnusedAutoPropertyAccessor.Global
|
||||
|
||||
using anbs_cp.Enums;
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
@@ -23,10 +24,7 @@ namespace anbs_cp.Classes;
|
||||
* Заменены интерфейсы IAction* на соответствующие классы
|
||||
*/
|
||||
|
||||
/// <summary>
|
||||
/// Класс, хранящий в себе состояния действия
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Тип значения - результата действия</typeparam>
|
||||
/// <inheritdoc />
|
||||
public class ActionState<T>: IActionState
|
||||
{
|
||||
/// <summary>
|
||||
@@ -350,4 +348,91 @@ public class ActionState<T>: IActionState
|
||||
}
|
||||
#endregion
|
||||
#endregion
|
||||
|
||||
#region Реализация интерфейса ISerializable
|
||||
/// <inheritdoc />
|
||||
public string Serialize ()
|
||||
{
|
||||
// Создаю модель
|
||||
ActionStateSerializable serializableModel = new();
|
||||
|
||||
// Для каждого информационного сообщения
|
||||
foreach (IActionStateMessage info in Info)
|
||||
// - добавляю в модель
|
||||
serializableModel.Info.Add(info.Serialize());
|
||||
|
||||
// Для каждого предупреждения
|
||||
foreach (IActionStateMessage warning in Warnings)
|
||||
// - добавляю в модель
|
||||
serializableModel.Info.Add(warning.Serialize());
|
||||
|
||||
// Для каждой ошибки
|
||||
foreach (IActionStateMessage error in Errors)
|
||||
// - добавляю в модель
|
||||
serializableModel.Info.Add(error.Serialize());
|
||||
|
||||
// Создаю модель значения
|
||||
ActionStateSerializableValue value = new();
|
||||
|
||||
// Получаю данные
|
||||
value.GetValue(Value);
|
||||
|
||||
// Добавляю в модель
|
||||
serializableModel.Value = value.Serialize();
|
||||
|
||||
// Возвращаю сериализованную модель
|
||||
return new SysTextSerializer().Serialize(serializableModel);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Deserialize (string json)
|
||||
{
|
||||
// Десериализую строку
|
||||
ActionStateSerializable itemSerializable = new SysTextSerializer().Deserialize<ActionStateSerializable>(json) ?? new();
|
||||
|
||||
// Создаю модель значения
|
||||
ActionStateSerializableValue value = new();
|
||||
|
||||
// Очищаю списки
|
||||
Info.Clear();
|
||||
Warnings.Clear();
|
||||
Errors.Clear();
|
||||
|
||||
// Для каждого информационного сообщения
|
||||
foreach (string infoString in itemSerializable.Info)
|
||||
{
|
||||
// - создаю сообщение
|
||||
ActionStateMessage info = new();
|
||||
// - десериализую в него данные из модели
|
||||
info.Deserialize(infoString);
|
||||
// - добавляю в список
|
||||
Info.Add(info);
|
||||
}
|
||||
foreach (string warningString in itemSerializable.Warnings)
|
||||
{
|
||||
// - создаю сообщение
|
||||
ActionStateMessage warning = new();
|
||||
// - десериализую в него данные из модели
|
||||
warning.Deserialize(warningString);
|
||||
// - добавляю в список
|
||||
Info.Add(warning);
|
||||
}
|
||||
foreach (string errorString in itemSerializable.Errors)
|
||||
{
|
||||
// - создаю сообщение
|
||||
ActionStateMessage error = new();
|
||||
// - десериализую в него данные из модели
|
||||
error.Deserialize(errorString);
|
||||
// - добавляю в список
|
||||
Info.Add(error);
|
||||
}
|
||||
|
||||
// Десериализую данные значения из модели
|
||||
value.Deserialize(itemSerializable.Value);
|
||||
|
||||
// Получаю значение
|
||||
Value = value.SetValue<T>();
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
27
anbs_cp/Classes/ActionStateSerializable.cs
Normal file
27
anbs_cp/Classes/ActionStateSerializable.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Сериализованная модель класса, хранящего в себе состояния действия
|
||||
/// </summary>
|
||||
public class ActionStateSerializable
|
||||
{
|
||||
/// <summary>
|
||||
/// Список информации
|
||||
/// </summary>
|
||||
public List<string> Info { get; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// Список предупреждений
|
||||
/// </summary>
|
||||
public List<string> Warnings { get; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// Список ошибок
|
||||
/// </summary>
|
||||
public List<string> Errors { get; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// Значение
|
||||
/// </summary>
|
||||
public string Value { get; set; } = string.Empty;
|
||||
}
|
90
anbs_cp/Classes/ActionStateSerializableValue.cs
Normal file
90
anbs_cp/Classes/ActionStateSerializableValue.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Сериализованная модель значения класса, хранящего в себе состояния действия
|
||||
/// </summary>
|
||||
public class ActionStateSerializableValue: ISerializable
|
||||
{
|
||||
/// <summary>
|
||||
/// Значение - null?
|
||||
/// </summary>
|
||||
private bool IsNull { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Сериализуемое значение
|
||||
/// </summary>
|
||||
private string Serialized { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Получает значение из <paramref name="value"/>
|
||||
/// </summary>
|
||||
/// <param name="value">Значение</param>
|
||||
/// <typeparam name="T">Тип значения</typeparam>
|
||||
public void GetValue<T> (T? value)
|
||||
{
|
||||
// Значение - null?
|
||||
IsNull = value == null;
|
||||
|
||||
// Если не null
|
||||
if (value != null)
|
||||
{
|
||||
// - значение поддерживает интерфейс IsSerialized
|
||||
if (value is ISerializable serializableValue)
|
||||
// -- сериализую
|
||||
Serialized = serializableValue.Serialize();
|
||||
else
|
||||
// -- сериализую
|
||||
Serialized = new SysTextSerializer().Serialize(value);
|
||||
}
|
||||
else
|
||||
// Сериализую
|
||||
Serialized = new SysTextSerializer().Serialize(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Устанавливает значение
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Класс</typeparam>
|
||||
/// <returns>Значение</returns>
|
||||
public T? SetValue<T> ()
|
||||
{
|
||||
// Если null
|
||||
if (IsNull)
|
||||
// - то возыращаем null
|
||||
return default;
|
||||
|
||||
// Если тип T не реализует интерфейс ISerializable
|
||||
if (typeof(T).GetInterface(nameof(ISerializable)) == null)
|
||||
// - то воспользуемся простой десериализацией
|
||||
return new SysTextSerializer().Deserialize<T>(Serialized);
|
||||
|
||||
// Создаю модель
|
||||
T? model = default;
|
||||
|
||||
// Десериализую модель
|
||||
(model as ISerializable)?.Deserialize(Serialized);
|
||||
|
||||
// Возвращаю модель
|
||||
return model!;
|
||||
|
||||
// Если null
|
||||
}
|
||||
|
||||
#region Реализация интерфейса ISerializable
|
||||
/// <inheritdoc />
|
||||
public string Serialize () => new SysTextSerializer().Serialize(this);
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Deserialize (string json)
|
||||
{
|
||||
// Десериализую строку
|
||||
ActionStateSerializableValue item = new SysTextSerializer().Deserialize<ActionStateSerializableValue>(json) ?? new();
|
||||
|
||||
// Передаю параметры
|
||||
IsNull = item.IsNull;
|
||||
Serialized = item.Serialized;
|
||||
}
|
||||
#endregion
|
||||
}
|
@@ -3,9 +3,9 @@
|
||||
namespace anbs_cp.Interfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Интерфейс класса, хранящего в себе состояния действия
|
||||
/// Класс, хранящий в себе состояния действия
|
||||
/// </summary>
|
||||
public interface IActionState
|
||||
public interface IActionState: ISerializable
|
||||
{
|
||||
/// <summary>
|
||||
/// Список информации
|
||||
|
Reference in New Issue
Block a user