c# - JSON.NET está ignorando propiedades en tipos derivados de System.Exception. ¿Por qué?
serialization (2)
Quiero que JSON serialice un objeto de excepción personalizado que hereda System.Exception. JsonConvert.SerializeObject parece ignorar propiedades del tipo derivado. El problema se puede ilustrar de manera muy simple:
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();
}
}
Intenté agregar los atributos DataContract y DataMember en los lugares correctos. Ellos no ayudan. ¿Cómo hago que esto funcione?
Como Exception implementa ISerializable
, Json.Net lo usa para serializar el objeto de manera predeterminada. Puedes decirle que ignore ISerializable
así:
var settings = new JsonSerializerSettings() {
Formatting = Formatting.Indented,
ContractResolver = new DefaultContractResolver() {
IgnoreSerializableInterface = true
}
};
Console.WriteLine(JsonConvert.SerializeObject(new MyException {MyProperty = "foobar"}, settings));
También puede agregar y recuperar un objeto específico en el almacén System.Runtime.Serialization.SerializationInfo
anulando el método GetObjectData
y el ctor(SerializationInfo, StreamingContext)
:
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);
}
}
De esta forma, la propiedad MyCustomObject
se incluirá en la serialización y deserialización.