为什么SerializationInfo没有TryGetValue方法?

在C#中实现ISerializable接口时,我们提供了一个构造函数,该构造函数接受SerializationInfo对象,然后使用各种GetInt32GetObject等方法对其进行查询,以填充我们尝试反序列化的对象的字段。

实现此接口的一个主要原因,而不仅仅是使用[Serializable]属性,是为了向后兼容:如果我们在某个时刻向类中添加了新字段,我们可以捕获由序列化的旧版本引发的SerializationException 。类,并以适当的方式处理它们。

我的问题如下:为什么我们必须将这些例外用于控制流程? 如果我反序列化前一段时间保存的大量类,可能每个类中的每个缺失字段都会抛出exception,从而导致性能非常差。

为什么SerializationInfo类不提供TryGetValue方法,如果名称字符串不存在,它们只返回false

您可以遍历可用字段并使用switch ,但是……

  foreach(SerializationEntry entry in info) { switch(entry.Name) { ... } } 

或者你可以使用protobuf-net ;-p

好吧没有人回答’为什么’,但我猜这是给MS的..

我对任何有需要的人的实施:

 public static class SerializationInfoExtensions { public static bool TryGetValue(this SerializationInfo serializationInfo, string name, out T value) { try { value = (T) serializationInfo.GetValue(name, typeof(T)); return true; } catch (SerializationException) { value = default(T); return false; } } public static T GetValueOrDefault(this SerializationInfo serializationInfo, string name, Lazy defaultValue) { try { return (T) serializationInfo.GetValue(name, typeof(T)); } catch (SerializationException) { return defaultValue.Value; } } }