为什么SerializationInfo没有TryGetValue方法?
在C#中实现ISerializable
接口时,我们提供了一个构造函数,该构造函数接受SerializationInfo
对象,然后使用各种GetInt32
, GetObject
等方法对其进行查询,以填充我们尝试反序列化的对象的字段。
实现此接口的一个主要原因,而不仅仅是使用[Serializable]
属性,是为了向后兼容:如果我们在某个时刻向类中添加了新字段,我们可以捕获由序列化的旧版本引发的SerializationException
。类,并以适当的方式处理它们。
我的问题如下:为什么我们必须将这些例外用于控制流程? 如果我反序列化前一段时间保存的大量类,可能每个类中的每个缺失字段都会抛出exception,从而导致性能非常差。
为什么SerializationInfo
类不提供TryGetValue
方法,如果名称字符串不存在,它们只返回false
?
您可以遍历可用字段并使用switch
,但是……
foreach(SerializationEntry entry in info) { switch(entry.Name) { ... } }
或者你可以使用protobuf-net ;-p
好吧没有人回答’为什么’,但我猜这是给MS的..
我对任何有需要的人的实施:
上述就是C#学习教程:为什么SerializationInfo没有TryGetValue方法?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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; } } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1012693.html