2012-12-10 102 views
4

有什么办法序列化下面的类的对象,并以某种方式忽略抛出的异常?Serialize属性抛出NotImplementedException

public class HardToSerialize 
{ 
    public string IAmNotTheProblem { get; set; } 
    public string ButIAm { get { throw new NotImplementedException(); } } 
} 

当它试图序列化ButIAm属性的值不令人惊讶Newtonsoft引发错误。

我无权访问该类,因此无法用任何属性修饰它。

说明:我希望这适用于任何具有引发NotImplementedException的属性的对象。 HardToSerialize课只是一个例子。

回答

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

可能的解决方法是从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 
}; 
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

+0

我希望这适用于任何可能具有抛出NotImplementedException属性的对象。我已经更新了这个问题。 –

+0

@JesperPalm:具有未实现属性的类应该是例外而不是规则。我会为他们每个人配备代理人,因为它可以让你更好地控制你想要和不想要的课程。更不用说处理错误事件的事实,你可能会因为引发和捕获异常而变得更糟。 – digEmAll

相关问题