2009-11-04 15 views
14

Bei der Implementierung der -Schnittstelle in C# stellen wir einen Konstruktor zur Verfügung, der ein SerializationInfo-Objekt annimmt und dann mit verschiedenen Methoden GetInt32, GetObject usw. abfragt, um die Felder des Objekts zu füllen, das wir deserialisieren möchten.Warum hat SerializationInfo keine TryGetValue-Methoden?

Ein wichtiger Grund, diese Schnittstelle zu implementieren, anstatt nur mit dem [Serializable] Attribut ist für die Abwärtskompatibilität: Wenn wir neue Felder der Klasse an einem bestimmten Punkt hinzugefügt haben, können wir die SerializationException durch eine serialisierte, ältere Version geworfen fangen der Klasse, und behandeln sie in angemessener Weise.

Meine Frage ist die folgende: Warum müssen wir diese Ausnahmen für das verwenden, was im Wesentlichen Kontrollfluss ist? Wenn ich eine große Anzahl von Klassen deserialisiere, die vor einiger Zeit gespeichert wurden, löst möglicherweise jedes fehlende Feld in jeder Klasse eine Ausnahme aus, was zu einer wirklich schlechten Leistung führt.

Warum bietet die Klasse SerializationInfo keine TryGetValue Methoden, die einfach false zurückgeben würden, wenn die Namenszeichenfolge nicht vorhanden wäre?

+0

fragt wer auch immer implementiert diese Klasse –

+4

gut vielleicht sind sie hier: P –

Antwort

23

Sie können über die zur Verfügung stehenden Felder durchlaufen und switch verwenden, obwohl ...

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

Oder könnten Sie protobuf-net ;-p

+2

cool; Dies scheint in der VS2008-Dokumentation nicht dokumentiert zu sein. –

+1

Einverstanden. Dies scheint nirgendwo dokumentiert zu sein. Nichts scheint zu sagen, dass SerializationInfo aufzählbar ist. Aber es hat für mich funktioniert. –

+1

@Michael außer [hier] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationinfo.getenumerator.aspx) natürlich, oder (@ Joel) geht zurück zu 1.1, [ hier] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationinfo.getenumerator (v = VS.71) .aspx) –

0

Nun niemand antwortete 'Warum', aber ich ist zu raten, dass zu MS adressiert ist ..

Meine Implementierung für jedermann in Not:

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; 
     } 
    } 
} 
Verwandte Themen