This commit is contained in:
2024-02-11 11:19:17 +03:00
parent 341b409264
commit a586c5a0f9
7 changed files with 155 additions and 10 deletions

View File

@@ -1,23 +1,29 @@
namespace anbs_cp.Structs;
using anbs_cp.Classes;
using anbs_cp.Enums;
using anbs_cp.Exceptions;
using ISerializable = anbs_cp.Interfaces.ISerializable;
namespace anbs_cp.Structs;
/// <summary>
/// Пара ключ-значение
/// Пара ключ-значение
/// </summary>
/// <typeparam name="TK">Тип ключа</typeparam>
/// <typeparam name="TV">Тип значения</typeparam>
/// <param name="key">Ключ</param>
/// <param name="value">Значение</param>
public struct KeyValue<TK, TV>(TK key, TV? value)
public struct KeyValue<TK, TV> (TK key, TV? value): ISerializable
{
#region Свойства
/// <summary>
/// Ключ
/// Ключ
/// </summary>
public TK Key { get; set; } = key;
/// <summary>
/// Значение
/// Значение
/// </summary>
public TV? Value { get; set; } = value;
@@ -26,10 +32,56 @@ public struct KeyValue<TK, TV>(TK key, TV? value)
#region Методы
/// <summary>
/// Получает ключ-значение по умолчанию
/// Получает ключ-значение по умолчанию
/// </summary>
/// <returns>Ключ-значение по умолчанию</returns>
public static KeyValue<TK, TV> GetDefault() => new();
public static KeyValue<TK, TV> GetDefault () => new();
#endregion
#region Реализация интерфейса ISerializable
/// <inheritdoc />
public readonly string Serialize ()
{
// Получаю serialized-значение ключа
string keySerialized = new SysTextSerializer().Serialize(Key);
// Исключаю из этого значения = (заменяя на %EQ%)
keySerialized = keySerialized.Replace("=", "%EQ%");
// Получаю serialized-значение значения
string valueSerialized = new SysTextSerializer().Serialize(Value);
// Исключаю из этого значения = (заменяя на %EQ%)
valueSerialized = valueSerialized.Replace("=", "%EQ%");
// Вывожу результат
return $"{keySerialized}={valueSerialized}";
}
/// <inheritdoc />
public void Deserialize (string json)
{
// Разделяю сериализованную строку вида КЛЮЧ=ЗНАЧЕНИЕ на ключ и значение
string[] splited = json.Split('=');
// Проверяю количество частей (должно быть 2)
if (splited.Length != 2)
throw new SerializeException(ESerializeExceptionAction.Deserialize, json,
"Неверное количество частей! Наверное, лишнее =?");
// Получаю сериализованное представление ключа
string keySerialized = splited[0].Replace("%EQ%", "=");
// Получаю сериализованное представление значения
string valueSerialized = splited[1].Replace("%EQ%", "=");
// Десериализую ключ
Key = (new SysTextSerializer().Deserialize<TK>(keySerialized) ?? default(TK))!;
// Десериализую значение
Value = new SysTextSerializer().Deserialize<TV>(valueSerialized);
}
#endregion
}