using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using System.Threading.Tasks; namespace IpcLibrary.Serialization { /// /// Exception异常的JSON转换器 /// public class ExceptionConverter : JsonConverter { public override Exception Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var doc = JsonDocument.ParseValue(ref reader); var root = doc.RootElement; var message = root.TryGetProperty("message", out var msgElement) ? msgElement.GetString() : "Unknown error"; var typeName = root.TryGetProperty("type", out var typeElement) ? typeElement.GetString() : null; if (!string.IsNullOrEmpty(typeName)) { var exceptionType = Type.GetType(typeName); if (exceptionType != null && typeof(Exception).IsAssignableFrom(exceptionType)) { try { return (Exception)Activator.CreateInstance(exceptionType, message); } catch { // 如果创建特定异常类型失败,返回通用异常 } } } return new Exception(message); } public override void Write(Utf8JsonWriter writer, Exception value, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteString("type", value.GetType().AssemblyQualifiedName); writer.WriteString("message", value.Message); writer.WriteString("stackTrace", value.StackTrace); writer.WriteEndObject(); } } }