Question

Je veux désérialiser un objet mais je ne connais pas la classe à l’avance. Alors, considérons le code suivant ...

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

Que puis-je faire si je ne connais pas la classe à l'avance? Dites, par exemple, "MonFichier.bin". était un MyObject ou un MyFoo. Comment déterminer quel objet instancier?

Quelque chose comme ...

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);
Était-ce utile?

La solution

Il suffit de faire:

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

Autres conseils

Principalement comme le dit leppie ...

Si vous souhaitez tester quelques types connus, vous pouvez utiliser l'option "is est" / "sous":

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

Mais en général, vous laisseriez le sérialiseur se préoccuper de ces détails ...

C’est bien sûr très différent avec les sérialiseurs basés sur le XML, car vous devez indiquer au sérialiseur ce qui est attendu, au lieu que le sérialiseur vous dise ce qu’il a obtenu.

Quelques suggestions,

  1. Si vous désérialisez l'objet sans transtyper l'objet myObject = formatter.Deserialize (stream); et utilisez ensuite le " comme " Pour vérifier la compatibilité des types connus avec les types connus, cela pourrait fonctionner.

  2. Jetez un coup d'œil à la propriété BinaryFormatter.Binder de type SerializationBinder. Nous l'avons déjà utilisée pour effectuer la compatibilité avec les versions antérieures de notre format de fichier et les résultats ont été excellents. Fondamentalement, vous permet de contrôler totalement ce qui est désérialisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top