首页 文章

序列化自定义异常对象

提问于
浏览
0

它是在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:输入数据协定名称为“HttpException:http://schemas.datacontract.org/2004/07/Service.Model.Exceptions”的“Service.Model.Exceptions.HttpException” . 将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中 . 在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract,XmlWriterDelegator xmlWriter,Object obj,Boolean verifyKnownType,RuntimeTypeHandle declaredTypeHandle,Type declaredType)

Edit

尝试使用System.Web.Extensions但有波浪线 .

enter image description here

2 回答

  • 0

    我希望但是我不能脱离第三方库,因为某些要求只能使用本机实现 .

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

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

    但正如我在评论中所说,我更愿意Json.Net

  • 0

    .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方法 .

相关问题