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のリストまたはこの型を含むオブジェクトをシリアル化する必要がある場合は、カスタムを実装する価値があります。 一方、毎回 1 つのオブジェクトをシリアル化するだけの場合は、オブジェクトの代理コピーを作成し、カスタム を実装せずにそれをシリアル化します。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 に答える