C # BinaryFormatter - Come posso scoprire la classe dei dati binari?
-
03-07-2019 - |
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);
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,
-
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.
-
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.