我会去一个替代类和一个自定义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
。
我希望这适用于任何可能具有抛出NotImplementedException属性的对象。我已经更新了这个问题。 –
@JesperPalm:具有未实现属性的类应该是例外而不是规则。我会为他们每个人配备代理人,因为它可以让你更好地控制你想要和不想要的课程。更不用说处理错误事件的事实,你可能会因为引发和捕获异常而变得更糟。 – digEmAll