C # BinaryFormatter - Как я могу узнать класс двоичных данных?
-
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, которое мы использовали ранее для обратной совместимости со старыми версиями нашего формата файлов, и оно работало замечательно. По сути, вы можете полностью контролировать то, что десериализовано как.