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

ATargetInvokationException应该有一个InnerException它将为您提供更多信息。如果情况只是缺少属性,我建议您检查 catch 块中的内部并重新抛出。

于 2011-09-29T10:04:58.047 回答
2

由于未列TargetInvocationException在您应该对该方法期望的异常集中(请参阅 MSDN),我会说尝试处理它是错误的。更好的方法是循环使用它确实具有的名称,然后选择您期望的名称:

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

或者...使用不那么繁琐的序列化程序;p

foreach(顺便说一句,上面使用基于类型化枚举器和方法的替代处理GetEnumerator();它没有实现IEnumerable/ IEnumerable<T>,但是......它不必;你可以foreach不用它)

于 2011-09-29T10:17:49.690 回答