2

BinaryFormatterを使用して、いくつかのオブジェクトをシリアル化および逆シリアル化します。これらのオブジェクトの構造は次のとおりです。

[Serializable()]
public class SerializableObject : ISerializable
{
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("SomeProperty", SomeProperty);
        // similar for other properties
    }

    public SerializableObject(SerializationInfo info, StreamingContext context)
    {
        this.SomeProperty = (SomePropertyClass)info.GetValue("SomeProperty", typeof(SomePropertyClass));
        // similar for other properties
    }
}

オブジェクトを逆シリアル化しようとすると、「SomeProperty」エントリが見つからない場合(たとえば、名前が変更されたか削除されたため)、TargetInvocation例外がスローされることに気付きました。将来、SerializableObjectクラスのプロパティを変更する予定なので、次のようにアプリケーションをクラッシュさせるのではなく、例外をキャッチして問題のあるプロパティの値をデフォルト値に設定することを考えていました。

public SerializableObject(SerializationInfo info, StreamingContext context)
{
    try
    {
        this.SomeProperty = (SomePropertyClass)info.GetValue("SomeProperty", typeof(SomePropertyClass));
    }
    catch (TargetInvocationException)
    {
        this.SomeProperty = SomePropertyClass.DefaultValue;
    }
}

ご存知のように、処理方法がわからない、または処理できない例外をキャッチすることは悪い習慣なので、この場所でキャッチしても安全かどうかを尋ねています。他の理由(私にはわからないため、処理すべきではない)で同じ例外をスローできますか?

4

2 に答える 2

4

AにTargetInvokationExceptionは、InnerExceptionより多くの情報を提供するが必要です。キャッチブロックの内部をチェックして、状況が単に不足しているプロパティである場合は、再スローすることをお勧めします。

于 2011-09-29T10:04:58.047 に答える
2

TargetInvocationException例外のセットにリストされていないので、そのメソッドから期待する必要があります(MSDNを参照)。これを処理しようとするのは間違っていると思います。より良いアプローチは、それ持っている名前をループし、あなたが期待したものを選ぶことです:

    foreach(SerializationEntry entry in info)
    {
        switch(entry.Name)
        {
            case "Foo": //...   
            case "Bar": //...
        }
    }

または...それほど煩わしくないシリアライザーを使用します;p

(ところで、上記は型付き列挙子とメソッドforeachに基づく代替処理を使用しています。/は実装されていませんが、...実装する必要はありません。それがなくても使用できます)GetEnumerator()IEnumerableIEnumerable<T>foreach

于 2011-09-29T10:17:49.690 に答える