首页 文章

JSON.NET忽略从System.Exception派生的类型中的属性 . 为什么?

提问于
浏览
15

我想JSON序列化一个继承System.Exception的自定义异常对象 . JsonConvert.SerializeObject似乎忽略派生类型的属性 . 问题可以很简单地说明:

class MyException : Exception {
    public string MyProperty { get; set; }
}

class Program {
    static void Main(string[] args) {
        Console.WriteLine(JsonConvert.SerializeObject(new MyException {MyProperty = "foobar"}, Formatting.Indented));
        //MyProperty is absent from the output. Why?
        Console.ReadLine();
    }
}

我已经尝试在正确的位置添加DataContract和DataMember属性 . 他们没有帮助 . 我如何让它工作?

2 回答

  • 8

    因为Exception实现了 ISerializable ,所以Json.Net默认使用它来序列化对象 . 您可以告诉它忽略 ISerializable 如下:

    var settings = new JsonSerializerSettings() {
        Formatting = Formatting.Indented,
        ContractResolver = new DefaultContractResolver() { 
            IgnoreSerializableInterface = true 
        } 
    };
    Console.WriteLine(JsonConvert.SerializeObject(new MyException {MyProperty = "foobar"}, settings));
    
  • 15

    您还可以通过覆盖 GetObjectData 方法和 ctor(SerializationInfo, StreamingContext) 来将特定对象添加和检索到 System.Runtime.Serialization.SerializationInfo 存储中:

    public class MyCustomException : Exception
    {
        public string MyCustomData { get; set; }
    
        protected MyCustomException (SerializationInfo info, StreamingContext context) : base(info, context)
        {
            MyCustomData = info.GetString("MyCustomData");
        }
    
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            base.GetObjectData(info, context);
            info.AddValue("MyCustomData", MyCustomData);
        }
    }
    

    这样, MyCustomObject 属性将包含在序列化和反序列化中 .

相关问题