diff options
author | chai <215380520@qq.com> | 2024-06-03 10:15:45 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2024-06-03 10:15:45 +0800 |
commit | acea7b2e728787a0d83bbf83c8c1f042d2c32e7e (patch) | |
tree | 0bfec05c1ca2d71be2c337bcd110a0421f19318b /Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs | |
parent | 88febcb02bf127d961c6471d9e846c0e1315f5c3 (diff) |
+ plugins project
Diffstat (limited to 'Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs')
-rw-r--r-- | Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs b/Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs new file mode 100644 index 0000000..ef5b5cb --- /dev/null +++ b/Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs @@ -0,0 +1,50 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MonoGame.Extended.Serialization; + +/// <summary> +/// Converts a <see cref="Range{T}"/> value to or from JSON. +/// </summary> +public class RangeJsonConverter<T> : JsonConverter<Range<T>> where T : IComparable<T> +{ + /// <inheritdoc /> + public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(Range<T>); + + /// <inheritdoc /> + public override Range<T> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + Span<T> values = reader.ReadAsMultiDimensional<T>(); + + if (values.Length == 2) + { + if (values[0].CompareTo(values[1]) < 0) + { + return new Range<T>(values[0], values[1]); + } + + return new Range<T>(values[1], values[0]); + } + + if (values.Length == 1) + { + return new Range<T>(values[0], values[0]); + } + + throw new InvalidOperationException("Invalid range"); + } + + /// <inheritdoc /> + /// <exception cref="ArgumentNullException"> + /// Throw if <paramref name="writer"/> is <see langword="null"/>. + /// </exception> + public override void Write(Utf8JsonWriter writer, Range<T> value, JsonSerializerOptions options) + { + ArgumentNullException.ThrowIfNull(writer); + writer.WriteStartArray(); + JsonSerializer.Serialize(writer, value.Min, options); + JsonSerializer.Serialize(writer, value.Max, options); + writer.WriteEndArray(); + } +} |