Mac环境下.NET Core项目序列化自定义异常遇SerializationException问题咨询
嘿,这个问题我之前在项目里也碰到过,本质就是DataContractSerializer没办法自动识别你的自定义HttpException类型,得明确告诉它这个类型是「已知可处理」的才行。给你几个不同场景下的解决方案,你按需选:
方案1:用
KnownTypeAttribute标记相关类 这是最常用的方式,适合希望序列化器默认识别该类型的场景。
首先,先确保你的自定义异常类本身标记了DataContract特性(如果之前没加的话),同时用DataMember标记你需要序列化的属性:
[DataContract] public class HttpException : Exception { [DataMember] public int StatusCode { get; set; } [DataMember] public string ErrorMessage { get; set; } // 你的构造函数、其他业务逻辑代码 }
如果这个异常是作为某个数据契约类的属性被序列化的(比如一个统一的错误返回模型),还需要在这个返回模型上添加KnownType特性,指定要识别的异常类型:
[DataContract] [KnownType(typeof(HttpException))] public class ApiErrorResponse { [DataMember] public string Message { get; set; } [DataMember] public Exception ExceptionDetails { get; set; } }
方案2:手动指定已知类型创建序列化器
如果是你自己手动实例化DataContractSerializer来完成序列化操作,那可以在创建序列化器的时候,直接把HttpException加入已知类型列表:
// 假设你要序列化的是Exception类型的实例(实际是HttpException) var serializer = new DataContractSerializer( typeof(Exception), new Type[] { typeof(HttpException) } ); // 后续序列化操作示例 using var memoryStream = new MemoryStream(); serializer.WriteObject(memoryStream, yourHttpExceptionInstance); memoryStream.Position = 0; using var streamReader = new StreamReader(memoryStream); string serializedJson = streamReader.ReadToEnd(); // 输出或使用这个json字符串
这个方法适合你完全控制序列化流程的场景,不需要修改任何类的特性标记。
方案3:全局配置ASP.NET Core的序列化规则
如果是在ASP.NET Core Web API中返回这个异常,希望全局的序列化都能自动识别它,可以在项目的配置文件(Program.cs或旧版本的Startup.cs)里配置Mvc的序列化选项:
builder.Services.AddControllers() .AddJsonOptions(options => { // 移除默认的System.Text.Json格式化器(如果你的项目用的是DataContractSerializer) options.OutputFormatters.RemoveType<SystemTextJsonOutputFormatter>(); // 添加配置好已知类型的DataContractJsonSerializer格式化器 options.OutputFormatters.Add(new DataContractJsonOutputFormatter( new DataContractJsonSerializerSettings { KnownTypes = { typeof(HttpException) } } )); });
这样所有API返回中涉及到HttpException的序列化都会自动被处理。
额外提醒:如果你的HttpException还有子类,记得把这些子类也加入已知类型列表,不然同样会出现类似的序列化异常。
内容的提问来源于stack exchange,提问作者App2015
相关产品推荐
相关产品推荐

