5

有没有办法序列化以下类的对象并以某种方式忽略抛出的异常?

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

毫不奇怪,Newtonsoft 在尝试序列化ButIAm属性值时会引发错误。

我无权访问该课程,因此无法使用任何属性对其进行装饰。

澄清:我希望这适用于任何具有抛出 NotImplementedException 的属性的对象。类HardToSerialize只是一个例子。

4

3 回答 3

7

我找到了一个适合我的解决方案。这样做有什么大问题吗?

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);
于 2012-12-10T22:34:25.673 回答
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
HardToSerializeJsonConverter

于 2012-12-10T22:14:59.313 回答
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
};
于 2012-12-10T22:13:54.870 回答