2008-10-20 8 views
2

Я хочу десериализовать объект, но не знаю класс спереди. Итак, рассмотрим следующий код ...C# BinaryFormatter - Как узнать класс двоичных данных?

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

ответ

7

Вобще:

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

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

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

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

1

В основном, как говорит leppie ...

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

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

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

Это очень отличается от сериализаторов на основе xml, конечно, так как вам нужно рассказать сериализатору, что ожидается, а не сериализатор, рассказывающий вам, что это такое получил.