2009-11-04 64 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; 
     } 
    } 
} 
相關問題