C # BinaryFormatter - Как я могу узнать класс двоичных данных?

StackOverflow https://stackoverflow.com/questions/218133

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хочу десериализовать объект, но не знаю класс заранее. Итак, рассмотрим следующий код ...

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

Что я мог сделать, если я не знаю класс заранее? Скажем, например "MyFile.bin" был MyObject или MyFoo. Как определить, какой объект нужно создать?

Что-то вроде ...

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);
Это было полезно?

Решение

Просто сделай:

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

Другие советы

В основном, как говорит Леппи ...

Если вы хотите проверить его на наличие нескольких известных типов, вы можете использовать " is " / " as "

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

Но в целом вы бы позволили сериализатору беспокоиться о таких деталях ...

Разумеется, с сериализаторами на основе xml он сильно отличается, так как вам нужно сообщать сериализатору, что ожидается, а не сериализатору, сообщая вам, что он получил.

Несколько предложений,

<Ол>
  • Если вы десериализовали объект без приведения объекта myObject = formatter.Deserialize (stream); и затем используйте «как» оператор для проверки совместимости типов с известными типами, тогда это может работать.

  • Взгляните на свойство BinaryFormatter.Binder, имеющее тип SerializationBinder, которое мы использовали ранее для обратной совместимости со старыми версиями нашего формата файлов, и оно работало замечательно. По сути, вы можете полностью контролировать то, что десериализовано как.

  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top