20240211
This commit is contained in:
@@ -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
|
||||
}
|
Reference in New Issue
Block a user