20240326-1
This commit is contained in:
@@ -10,7 +10,7 @@ namespace anbs_cp.Classes;
|
||||
История версий
|
||||
|
||||
Обновлено 2024.03.26
|
||||
* Все интерфейсы объеденены в один IActionStateMessage
|
||||
* Все интерфейсы объеденины в один IActionStateMessage
|
||||
|
||||
Обновлено 2023.12.10
|
||||
* Заменены классы Action* на соответствующие интерфейсы
|
||||
@@ -434,5 +434,4 @@ public class ActionState<T>: IActionState
|
||||
Value = value.SetValue<T>();
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
@@ -1,46 +1,37 @@
|
||||
using anbs_cp.Interfaces;
|
||||
// ReSharper disable MemberCanBePrivate.Global
|
||||
// ReSharper disable MemberCanBeInternal
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Сериализованная модель значения класса, хранящего в себе состояния действия
|
||||
/// </summary>
|
||||
public class ActionStateSerializableValue: ISerializable
|
||||
public sealed class ActionStateSerializableValue: ISerializable
|
||||
{
|
||||
/// <summary>
|
||||
/// Значение - null?
|
||||
/// </summary>
|
||||
private bool IsNull { get; set; }
|
||||
public bool IsNull { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Сериализуемое значение
|
||||
/// </summary>
|
||||
private string Serialized { get; set; } = string.Empty;
|
||||
public 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)
|
||||
internal void GetValue<T> (T? value)
|
||||
{
|
||||
// Значение - null?
|
||||
IsNull = value == null;
|
||||
IsNull = value is 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);
|
||||
// - сериализую
|
||||
Serialized = value is not null ? new SysTextSerializer().Serialize(value) : string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -48,28 +39,43 @@ public class ActionStateSerializableValue: ISerializable
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Класс</typeparam>
|
||||
/// <returns>Значение</returns>
|
||||
public T? SetValue<T> ()
|
||||
internal T? SetValue<T> () => IsNull ? default : new SysTextSerializer().Deserialize<T>(Serialized);
|
||||
|
||||
/// <summary>
|
||||
/// Получает значение из <paramref name="value"/>
|
||||
/// </summary>
|
||||
/// <param name="value">Значение</param>
|
||||
/// <typeparam name="T">Тип значения</typeparam>
|
||||
internal void GetSerializedValue<T> (T? value) where T : ISerializable, new()
|
||||
{
|
||||
// Значение - null?
|
||||
IsNull = value is null;
|
||||
|
||||
// Если не null
|
||||
// - сериализую
|
||||
Serialized = value is not null ? value.Serialize() : string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Устанавливает значение
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Класс</typeparam>
|
||||
/// <returns>Значение</returns>
|
||||
internal T? SetSerializedValue<T> () where T : ISerializable, new()
|
||||
{
|
||||
// Если null
|
||||
if (IsNull)
|
||||
// - то возыращаем null
|
||||
// - то возвращаем null
|
||||
return default;
|
||||
|
||||
// Если тип T не реализует интерфейс ISerializable
|
||||
if (typeof(T).GetInterface(nameof(ISerializable)) == null)
|
||||
// - то воспользуемся простой десериализацией
|
||||
return new SysTextSerializer().Deserialize<T>(Serialized);
|
||||
|
||||
// Создаю модель
|
||||
T? model = default;
|
||||
T model = new ();
|
||||
|
||||
// Десериализую модель
|
||||
(model as ISerializable)?.Deserialize(Serialized);
|
||||
model.Deserialize(Serialized);
|
||||
|
||||
// Возвращаю модель
|
||||
return model!;
|
||||
|
||||
// Если null
|
||||
return model;
|
||||
}
|
||||
|
||||
#region Реализация интерфейса ISerializable
|
||||
|
116
anbs_cp/Classes/ActionStateSerialized.cs
Normal file
116
anbs_cp/Classes/ActionStateSerialized.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
using anbs_cp.Exceptions;
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Состояние действия
|
||||
///
|
||||
/// Обновлено 2024.03.26
|
||||
/// * Добавлен класс ActionState для классов, поддерживаемых интерфейс I
|
||||
/// </summary>
|
||||
public sealed class ActionStateSerialized<T>: ActionState<T> where T : ISerializable, new()
|
||||
{
|
||||
/// <summary>
|
||||
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="IActionState"/>).
|
||||
/// </summary>
|
||||
/// <param name="state">Запись состояния</param>
|
||||
public void AddState (ActionStateSerialized<T> state)
|
||||
{
|
||||
base.AddState(state);
|
||||
}
|
||||
|
||||
#region Переопределение реализации интерфейса ISerializable
|
||||
/// <summary>
|
||||
/// Сериализовать элемент в формат json
|
||||
/// </summary>
|
||||
/// <returns>Строка в формате json</returns>
|
||||
/// <exception cref="SerializeException">Ошибка при сериализации</exception>
|
||||
public new 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.GetSerializedValue(Value);
|
||||
|
||||
// Добавляю в модель
|
||||
serializableModel.Value = value.Serialize();
|
||||
|
||||
// Возвращаю сериализованную модель
|
||||
return new SysTextSerializer().Serialize(serializableModel);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Восстановить элемент из формата json
|
||||
/// </summary>
|
||||
/// <param name="json">Строка в формате json</param>
|
||||
/// <exception cref="SerializeException">Ошибка при десериализации</exception>
|
||||
public new 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.SetSerializedValue<T>();
|
||||
}
|
||||
#endregion
|
||||
}
|
@@ -9,7 +9,7 @@
|
||||
public sealed class ActionState: ActionState<string>
|
||||
{
|
||||
/// <summary>
|
||||
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="ActionState"/>).
|
||||
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="ActionState"/>).
|
||||
/// </summary>
|
||||
/// <param name="state">Запись состояния</param>
|
||||
public void AddState (ActionState state)
|
||||
|
Reference in New Issue
Block a user