Pergunta

Eu quero desserializar um objeto, mas não sei a classe na frente. Então, considere o seguinte código ...

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

O que eu poderia fazer se eu não sei a classe na frente? Digamos, por exemplo "MyFile.bin" foi um MyObject ou um myFoo. Como faço para determinar qual objeto para instanciar?

Algo 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);
Foi útil?

Solução

Basta fazer:

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

Outras dicas

Principalmente como leppie diz ...

Se você quiser testá-lo por alguns tipos conhecidos, você pode usar "é" / "como":

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

Mas, em geral, você iria deixar a preocupação serializer sobre tais detalhes ...

É muito diferente com serializers baseado em XML, é claro, desde que você precisa dizer o serializador o que é esperado, ao invés do serializer dizendo o que ele tem.

Algumas sugestões,

  1. Se você desserializar o objeto sem lançar objeto myObject = formatter.Deserialize (stream); e depois usar o "como" operador para verificar a compatibilidade de tipo para tipos conhecidos depois que o trabalho poder.

  2. Dê uma olhada BinaryFormatter.Binder propriedade que é do tipo SerializationBinder, que usei isso antes de fazer compatibilidade com versões anteriores para versões mais antigas do nosso formato de arquivo e que funcionou bem. Basicamente permite controlar totalmente o que algo é desserializado como.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top