2009-11-04 95 views
14

在C#中实现接口ISerializable时,我们提供了一个构造函数,它需要一个SerializationInfo对象,然后用各种GetInt32,GetObject等方法来查询它,以填充我们试图反序列化的对象的字段。为什么SerializationInfo没有TryGetValue方法?

实现这个接口,而不是仅仅使用[Serializable]属性,是为了向下兼容的一个主要的原因是:如果我们在某个时候添加新的字段到类,我们可以赶上通过序列化,旧版本抛出的SerializationException并以适当的方式处理它们。

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

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

+0

向谁实施那个类 – 2009-11-04 11:32:54

+4

也许他们在这里:P – 2009-11-04 11:43:19

回答

23

您可以在可用域迭代,并使用switch,但...

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

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

+2

很酷;这似乎没有记录在VS2008文档中。 – 2009-11-04 11:48:59

+1

同意。这似乎没有记录在任何地方。似乎没有什么可以说SerializationInfo是可枚举的。但是,它为我工作。 – 2011-01-31 23:15:49

+1

@Michael除了[here](http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationinfo.getenumerator.aspx)或(@Joel)回到1.1,[在这里](http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationinfo.getenumerator(v = VS.71).aspx) – 2011-02-01 06:25:21

0

那么没有人回答“为什么”,但我“M猜测,发送到了MS ..

我需要的人实施:

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; 
     } 
    } 
} 
相关问题