代码之家  ›  专栏  ›  技术社区  ›  Joel in Gö

为什么序列化信息没有TryGetValue方法?

  •  16
  • Joel in Gö  · 技术社区  · 17 年前

    在执行 ISerializable 在C中,我们提供了一个构造函数,它采用 SerializationInfo 对象,然后用 GetInt32 , GetObject 等。方法,以填充我们试图反序列化的对象的字段。

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

    我的问题是:为什么我们必须对控制流使用这些异常?如果我正在反序列化一段时间前保存的大量类,则可能每个类中缺少的每个字段都会引发异常,从而导致性能非常差。

    为什么 序列化信息 类不提供 TryGetValue 简单返回的方法 false 如果名称字符串不存在?

    2 回复  |  直到 8 年前
        1
  •  25
  •   Marc Gravell    17 年前

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

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

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

        2
  •  0
  •   Mugen    8 年前

    嗯,没有人回答“为什么”,但我猜那是写给女士的。

    我对任何需要帮助的人的实施:

    public static class SerializationInfoExtensions
    {
        public static bool TryGetValue<T>(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<T>(this SerializationInfo serializationInfo, string name, Lazy<T> defaultValue)
        {
            try
            {
                return (T) serializationInfo.GetValue(name, typeof(T));
            }
            catch (SerializationException)
            {
                return defaultValue.Value;
            }
        }
    }
    
    推荐文章