C # BinaryFormatter - Como posso descobrir a classe de dados binários?
-
03-07-2019 - |
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);
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,
-
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.
-
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.