diff --git a/anbs_cp/Classes/ActionState.cs b/anbs_cp/Classes/ActionState.cs index f0f7471..ab433d0 100644 --- a/anbs_cp/Classes/ActionState.cs +++ b/anbs_cp/Classes/ActionState.cs @@ -10,7 +10,7 @@ namespace anbs_cp.Classes; История версий Обновлено 2024.03.26 - * Все интерфейсы объеденены в один IActionStateMessage + * Все интерфейсы объеденины в один IActionStateMessage Обновлено 2023.12.10 * Заменены классы Action* на соответствующие интерфейсы @@ -434,5 +434,4 @@ public class ActionState: IActionState Value = value.SetValue(); } #endregion - } \ No newline at end of file diff --git a/anbs_cp/Classes/ActionStateSerializableValue.cs b/anbs_cp/Classes/ActionStateSerializableValue.cs index a738ea0..abafa4a 100644 --- a/anbs_cp/Classes/ActionStateSerializableValue.cs +++ b/anbs_cp/Classes/ActionStateSerializableValue.cs @@ -1,46 +1,37 @@ -using anbs_cp.Interfaces; +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable MemberCanBeInternal +using anbs_cp.Interfaces; namespace anbs_cp.Classes; /// /// Сериализованная модель значения класса, хранящего в себе состояния действия /// -public class ActionStateSerializableValue: ISerializable +public sealed class ActionStateSerializableValue: ISerializable { /// /// Значение - null? /// - private bool IsNull { get; set; } + public bool IsNull { get; set; } /// /// Сериализуемое значение /// - private string Serialized { get; set; } = string.Empty; + public string Serialized { get; set; } = string.Empty; /// /// Получает значение из /// /// Значение /// Тип значения - public void GetValue (T? value) + internal void GetValue (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; } /// @@ -48,28 +39,43 @@ public class ActionStateSerializableValue: ISerializable /// /// Класс /// Значение - public T? SetValue () + internal T? SetValue () => IsNull ? default : new SysTextSerializer().Deserialize(Serialized); + + /// + /// Получает значение из + /// + /// Значение + /// Тип значения + internal void GetSerializedValue (T? value) where T : ISerializable, new() + { + // Значение - null? + IsNull = value is null; + + // Если не null + // - сериализую + Serialized = value is not null ? value.Serialize() : string.Empty; + } + + /// + /// Устанавливает значение + /// + /// Класс + /// Значение + internal T? SetSerializedValue () where T : ISerializable, new() { // Если null if (IsNull) - // - то возыращаем null + // - то возвращаем null return default; - // Если тип T не реализует интерфейс ISerializable - if (typeof(T).GetInterface(nameof(ISerializable)) == null) - // - то воспользуемся простой десериализацией - return new SysTextSerializer().Deserialize(Serialized); - // Создаю модель - T? model = default; + T model = new (); // Десериализую модель - (model as ISerializable)?.Deserialize(Serialized); + model.Deserialize(Serialized); // Возвращаю модель - return model!; - - // Если null + return model; } #region Реализация интерфейса ISerializable diff --git a/anbs_cp/Classes/ActionStateSerialized.cs b/anbs_cp/Classes/ActionStateSerialized.cs new file mode 100644 index 0000000..6dafb7c --- /dev/null +++ b/anbs_cp/Classes/ActionStateSerialized.cs @@ -0,0 +1,116 @@ +using anbs_cp.Exceptions; +using anbs_cp.Interfaces; + +namespace anbs_cp.Classes; + +/// +/// Состояние действия +/// +/// Обновлено 2024.03.26 +/// * Добавлен класс ActionState для классов, поддерживаемых интерфейс I +/// +public sealed class ActionStateSerialized: ActionState where T : ISerializable, new() +{ + /// + /// Добавляет другое состояние (например, результат другого действия, который возвращает ). + /// + /// Запись состояния + public void AddState (ActionStateSerialized state) + { + base.AddState(state); + } + + #region Переопределение реализации интерфейса ISerializable + /// + /// Сериализовать элемент в формат json + /// + /// Строка в формате json + /// Ошибка при сериализации + 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); + } + + /// + /// Восстановить элемент из формата json + /// + /// Строка в формате json + /// Ошибка при десериализации + public new void Deserialize (string json) + { + // Десериализую строку + ActionStateSerializable itemSerializable = new SysTextSerializer().Deserialize(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(); + } + #endregion +} \ No newline at end of file diff --git a/anbs_cp/Classes/ActionStateSimply.cs b/anbs_cp/Classes/ActionStateSimply.cs index e186f7d..c5d36b1 100644 --- a/anbs_cp/Classes/ActionStateSimply.cs +++ b/anbs_cp/Classes/ActionStateSimply.cs @@ -9,7 +9,7 @@ public sealed class ActionState: ActionState { /// - /// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="ActionState"/>). + /// Добавляет другое состояние (например, результат другого действия, который возвращает ). /// /// Запись состояния public void AddState (ActionState state) diff --git a/anbs_cp/anbs_cp.csproj b/anbs_cp/anbs_cp.csproj index f007746..3f9ecca 100644 --- a/anbs_cp/anbs_cp.csproj +++ b/anbs_cp/anbs_cp.csproj @@ -2,7 +2,7 @@ net8.0 - 2024.3.26 + 2024.3.26.1 Александр Бабаев Набор компонентов ANB Software Библиотека полезных методов языка C# diff --git a/anbsoftware.componentspack.sln.DotSettings b/anbsoftware.componentspack.sln.DotSettings index 3ae7316..a83721d 100644 --- a/anbsoftware.componentspack.sln.DotSettings +++ b/anbsoftware.componentspack.sln.DotSettings @@ -23,9 +23,11 @@ True True True + True True True True + True True True True @@ -41,6 +43,7 @@ True True True + True True True True diff --git a/demo/ActionStateSerialize.Designer.cs b/demo/ActionStateSerialize.Designer.cs index c805b67..cc2c173 100644 --- a/demo/ActionStateSerialize.Designer.cs +++ b/demo/ActionStateSerialize.Designer.cs @@ -1,6 +1,6 @@ namespace demo; -partial class ActionStateSerialize +sealed partial class ActionStateSerialize { /// /// Required designer variable. diff --git a/demo/ActionStateSerialize.cs b/demo/ActionStateSerialize.cs index d87687b..c056d2f 100644 --- a/demo/ActionStateSerialize.cs +++ b/demo/ActionStateSerialize.cs @@ -2,7 +2,7 @@ namespace demo; -public partial class ActionStateSerialize: Form +public sealed partial class ActionStateSerialize: Form { public ActionStateSerialize () { @@ -16,7 +16,7 @@ public partial class ActionStateSerialize: Form Name = textBox1.Text.Length > 0 ? textBox1.Text : string.Empty }; - ActionState state = new(); + ActionState state = new(demoClass); state.AddError("ОШИБКА, ШЕФ!");