2009-11-04 19 views
14

C# içinde ISerializable arabirimini uygularken, SerializationInfo nesnesini alan bir kurucu sağladık ve sonra seri hale getirmeye çalıştığımız nesnenin alanlarını doldurmak için çeşitli GetInt32, GetObject vb. Yöntemlerle sorgular.SerializationInfo, neden TryGetValue yöntemlerine sahip değil?

Bu arayüzü uygulamak yerine, sadece [Serializable] özelliğini kullanmak yerine, geriye dönük uyumluluk içindir sağladığı en büyük nedeni: biz bir noktada sınıfa yeni alanlar eklendi varsa, bir tefrika, eski sürümü tarafından atılan SerializationException yakalayabilirsiniz sınıfın ve uygun bir şekilde bunları işlemek.

Sorum şu: Neden bu istisnaları temel olarak kontrol akışı için kullanmak zorundayız? Bir süre önce kaydedilen çok sayıda sınıfın seri hale getirilmesi durumunda, potansiyel olarak her sınıftaki eksik alan bir istisna atar ve bu da gerçekten kötü performansa neden olur.

SerializationInfo sınıfı neden ad dizisi yoksa false olan TryGetValue yöntemlerini sağlamıyor?

+0

her kimse sor: '.. o MS'e gönderilmiş tahmin ihtiyacı olan herkes için

My uygulanmasını m –

+4

sınıfını uygulamış olabilirler belki de buradalar: P –

cevap

23

Kullanılabilir alanlar üzerinde yineleme ve olsa switch kullanabilirsiniz ...

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

Yoksa protobuf-net ;-p

+2

cool; Bu VS2008 belgelerinde belgelenmiş gibi görünmüyor. –

+1

Anlaşmalı. Bu herhangi bir yerde belgelenmiş gibi görünmüyor. Hiçbir şey SerializationInfo'nın sayılabilir olduğunu söyleyemez. Ama benim için çalıştı. –

+1

@Michael tabii ki [burada] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationinfo.getenumerator.aspx) tabii ki, veya (@Joel) 1.1'e geri dönüyor, [ Burada] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationinfo.getenumerator (v = VS.71) .aspx) –

0

Eh kimse 'Neden' cevap kullanabilirsiniz, ama ben

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; 
     } 
    } 
} 
İlgili konular