Pregunta

Quiero deserializar un objeto pero no conozco la clase por adelantado. Entonces, considere el siguiente código ...

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

¿Qué podría hacer si no conozco a la clase por adelantado? Digamos, por ejemplo, " MiArchivo.bin " era un MyObject o un MyFoo. ¿Cómo puedo determinar qué objeto crear una instancia?

Algo así como ...

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);
¿Fue útil?

Solución

Solo haz:

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

Otros consejos

Principalmente como dice leppie ...

Si desea probar algunos tipos conocidos, puede usar " es " / " como " ;:

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

Pero en general, dejaría que el serializador se preocupe por tales detalles ...

Es muy diferente con los serializadores basados ??en xml, por supuesto, ya que necesita decirle al serializador lo que se espera, en lugar de que el serializador le diga lo que obtuvo.

Algunas sugerencias,

  1. Si deserializa el objeto sin lanzar el objeto myObject = formatter.Deserialize (stream); y luego use " como " El operador puede verificar la compatibilidad de tipos con los tipos conocidos que podrían funcionar.

  2. Eche un vistazo a la propiedad BinaryFormatter.Binder, que es del tipo SerializationBinder, la hemos usado antes para hacer compatibilidad con versiones anteriores de versiones anteriores de nuestro formato de archivo y funcionó muy bien. Básicamente te permite controlar totalmente lo que se deserializa como.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top