Domanda

Voglio deserializzare un oggetto ma non conosco la classe in anticipo. Quindi, considera il seguente codice ...

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

Cosa potrei fare se non conosco la lezione in anticipo? Ad esempio, ad esempio " MyFile.bin " era un MyObject o un MyFoo. Come determinare quale oggetto creare un'istanza?

Qualcosa come ...

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);
È stato utile?

Soluzione

Basta fare:

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

Altri suggerimenti

Principalmente come dice leppie ...

Se vuoi testarlo per alcuni tipi conosciuti, puoi usare " is " / " as " ;:

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

Ma in generale, lasceresti che il serializzatore si preoccupi di tali dettagli ...

È molto diverso con i serializzatori basati su XML, ovviamente, poiché è necessario dire al serializzatore cosa ci si aspetta, piuttosto che al serializzatore che ti dice cosa ha ottenuto.

Alcuni suggerimenti,

  1. Se si deserializza l'oggetto senza lanciare l'oggetto myObject = formatter.Deserialize (stream); e poi usa il " come " operatore per verificare la compatibilità dei tipi con tipi conosciuti che potrebbero funzionare.

  2. Dai un'occhiata alla proprietà BinaryFormatter.Binder che è di tipo SerializationBinder, l'abbiamo già usata per fare la compatibilità con le versioni precedenti del nostro formato di file e ha funzionato alla grande. Fondamentalmente ti permette di controllare totalmente ciò che qualcosa viene deserializzato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top