wwa*_*rby 15 c# serialization json json.net
我想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();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试在正确的位置添加DataContract和DataMember属性.他们没有帮助.我如何让它工作?
Mik*_*ray 16
因为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));
Run Code Online (Sandbox Code Playgroud)
您还可以System.Runtime.Serialization.SerializationInfo通过重写GetObjectData方法和以下方法将特定对象添加和检索到商店中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);
}
}
Run Code Online (Sandbox Code Playgroud)
这样,该MyCustomObject属性将包含在序列化和反序列化中.
| 归档时间: |
|
| 查看次数: |
5685 次 |
| 最近记录: |