Frage

Ich möchte ein Objekt deserialisieren, wissen aber nicht die Klasse vorne. Also, sollten Sie den folgenden Code ...

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject)formatter.Deserialize(stream);

Was könnte ich tun, wenn ich die Klasse vorne nicht kennen? Nehmen wir zum Beispiel „MyFile.bin“ war ein MyObject oder ein MyFoo. Wie kann ich feststellen, welche zu instanziiert Objekt?

So etwas wie ...

if (magic happens here == typeof(MyObject))  
    MyObject obj = (MyObject) formatter.Deserialize(stream);   
else if (more magic happens here == typeof(MyFoo))  
    MyFoo foo = (MyFoo)formatter.Deserialize(stream);
War es hilfreich?

Lösung

Just tun:

object result = formatter.Deserialize(stream); 
Type t = result.GetType();

Andere Tipps

Vor allem als leppie sagt ...

Wenn Sie es für ein paar bekannte Typen testen möchten, können Sie „ist“ / „als“:

MyFoo foo = result As MyFoo;
if(foo != null) { // it was one of those
  // special code
}

Aber im Allgemeinen würden Sie die Serializer Sorge über solche Details lassen ...

Es ist sehr unterschiedlich mit XML-basierten Serializer, natürlich, da Sie den Serializer sagen müssen, was erwartet wird, anstatt der Serializer zu sagen, was es.

Ein paar Vorschläge,

  1. Wenn Sie Deserialisieren das Objekt ohne Objekt Gießen myObject = formatter.Deserialize (Strom); und verwenden Sie dann den „als“ Operator für Typ-Kompatibilität zu bekannten Typen zu überprüfen, dann das könnte funktionieren.

  2. einen Blick auf BinaryFormatter.Binder Eigenschaft Nehmen Sie die vom Typ SerializationBinder ist, haben wir es zu tun, bevor die Abwärtskompatibilität für ältere Versionen unseres Dateiformates und es hat sehr gut genutzt. Grundsätzlich können Sie völlig kontrollieren, was etwas bekommt deserialisiert wie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top