有没有办法序列化以下类的对象,并以某种方式忽略抛出的异常?
public class HardToSerialize
{
public string IAmNotTheProblem { get; set; }
public string ButIAm { get { throw new NotImplementedException(); } }
}
当Newtonsoft尝试序列化ButIAm
属性的值时抛出错误并不令人惊讶。
我无法访问该类,因此我无法使用任何属性来装饰它。
澄清:我希望这适用于具有抛出NotImplementedException属性的任何对象。 HardToSerialize
类只是一个例子。
答案 0 :(得分:6)
我找到了一个适合我的解决方案。这样做有什么重大问题吗?
var settings = new JsonSerializerSettings();
settings.Error += (o, args) => {
if(args.ErrorContext.Error.InnerException is NotImplementedException)
args.ErrorContext.Handled = true;
};
var s = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented, settings);
答案 1 :(得分:2)
我会选择代理类和自定义JsonConverter
:
public class HardToSerializeSurrogate
{
public string IAmNotTheProblem { get; set; }
public string ButIAm { get; set; }
}
public class HardToSerializeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(HardToSerialize);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var item = (HardToSerialize)value;
// fill the surrogate with the values of the original object
var surrogate = new HardToSerializeSurrogate();
surrogate.IAmNotTheProblem = item.IAmNotTheProblem;
serializer.Serialize(writer, surrogate);
}
}
用法:
static void Main(string[] args)
{
var hardToSerialize = new HardToSerialize() { IAmNotTheProblem = "Foo" };
var s = JsonConvert.SerializeObject(hardToSerialize,
new HardToSerializeConverter());
}
当然,如果您必须序列化JsonConverter
个对象列表或包含此类型的对象,那么实现自定义HardToSerialize
是非常值得的。
另一方面,如果您只想每次序列化一个HardToSerialize
对象,只需创建该对象的代理副本并序列化该对象,而无需实现自定义JsonConverter
。
答案 2 :(得分:1)
可能的解决方法是从EasyToSerialize
创建另一个对象,然后对其进行序列化。
[Serializable]
public class EasyToSerialize
{
public string IAmNotTheProblem { get; set; }
// other serializable properties
}
HardToSerialize x = ...;
var foo2 = new EasyToSerialize {
IAmNotTheProblem = x.IAmNotTheProblem
// other properties here
};