using System.Collections.Concurrent; using Newtonsoft.Json; namespace EggLink.DanhengServer.Util; public class ConcurrentBagConverter : JsonConverter> { public override void WriteJson(JsonWriter writer, ConcurrentBag? value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); return; } serializer.Serialize(writer, value.ToArray()); } public override ConcurrentBag? ReadJson(JsonReader reader, Type objectType, ConcurrentBag? existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var array = serializer.Deserialize(reader); return array != null ? new ConcurrentBag(array) : new ConcurrentBag(); } } public class ConcurrentDictionaryConverter : JsonConverter> where TKey : notnull { public override void WriteJson(JsonWriter writer, ConcurrentDictionary? value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); return; } serializer.Serialize(writer, value.ToDictionary(kvp => kvp.Key, kvp => kvp.Value)); } public override ConcurrentDictionary? ReadJson(JsonReader reader, Type objectType, ConcurrentDictionary? existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var dictionary = serializer.Deserialize>(reader); return dictionary != null ? new ConcurrentDictionary(dictionary) : new ConcurrentDictionary(); } }