C # BinaryFormatter - Как я могу узнать класс двоичных данных? - PullRequest
2 голосов
/ 20 октября 2008

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

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);

Ответы [ 3 ]

7 голосов
/ 20 октября 2008

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

object result = formatter.Deserialize(stream); 
Type t = result.GetType();
1 голос
/ 20 октября 2008

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

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

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

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

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

0 голосов
/ 20 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...