This commit is contained in:
2024-03-26 18:50:21 +03:00
parent 16cd01cc7e
commit 8f6439b7d8
11 changed files with 601 additions and 70 deletions

View File

@@ -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
}

View 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;
}

View 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
}