序列化自定义异常对象

时间:2018-03-13 21:14:55

标签: c# json .net-core

它是在Mac上运行的.net核心项目。我有一个自定义的Exception类,我在错误的情况下将JSON序列化为输出。

  public class HttpException : Exception {
    private readonly int statusCode;

    public HttpException() {}

    public HttpException(int statusCode, string message) : base(message) {
        this.statusCode = statusCode;
    }

    public int StatusCode {get {return this.statusCode;}}
}

与json序列化相关的代码

Exception exception = (Exception)serviceRequest.ResultData;
MemoryStream memoryStream = new MemoryStream();  
DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(Exception));  


// it fails here
dataContractJsonSerializer.WriteObject(memoryStream, exception);  


byte[] json = memoryStream.ToArray();  
memoryStream.Close();  
Console.WriteLine(Encoding.UTF8.GetString(json, 0, json.Length));
  

System.Runtime.Serialization.SerializationException:输入' Service.Model.Exceptions.HttpException'数据合同名称' HttpException:http://schemas.datacontract.org/2004/07/Service.Model.Exceptions'不是预期的。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。      在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract,XmlWriterDelegator xmlWriter,Object obj,Boolean verifyKnownType,RuntimeTypeHandle declaredTypeHandle,Type declaredType)

修改

尝试使用System.Web.Extensions但是有粗糙的行。

enter image description here

2 个答案:

答案 0 :(得分:0)

  

我希望但是我不能脱离第三方库,因为有些要求,只能使用原生实现。

您可以包含System.Web.Extensions库并使用 JavaScriptSerializer

var ser = new JavaScriptSerializer();
string json = ser.Serialize(exception);

但正如我在评论中所说,我更希望Json.Net

答案 1 :(得分:0)

.p.net Core不支持

System.Web.Extensions,但是您可以使用Newtonsoft.Json nuget包。这两种方法之一应该可以解决问题:

Newtonsoft.Json.JsonConvert.DeserializeObject(string value)
Newtonsoft.Json.JsonConvert.DeserializeObject<T>(string value)

将单元测试从.Net 4.6.1移植到.Net Core时遇到了类似的问题。

在旁注中,如果遇到任何奇怪的运行时异常,请查找JavaScriptSerializer的实例,并将其替换为相应的Newtonsoft.Json方法。