Да, безусловно, возможно десериализовать, не зная фактического типа объекта. На самом деле, вам не нужно ничего знать о типе, чтобы десериализовать. Десериализация в двоичном смысле просто преобразует массив байтов в исходный тип и возвращает ссылку как объект. Вы можете затем привести это к любому легальному типу для экземпляра.
Например, следующий код десериализует поток в объект и преобразует ссылку в тип ReportBase.
public static void Deserialize(Stream stream)
{
BinaryFormatter formatter = new BinaryFormatter();
object obj = formatter.Deserialize(stream);
ReportBase report= (ReportBase) obj;
}
Обратите внимание, что я сказал, что это возможно. Чтобы это работало, поток должен указывать на действительный сериализованный экземпляр производного класса ReportBase, и этот класс должен соответствовать правилам сериализации.
Очень легко создать класс, который должен быть, но не сериализуемый: http://blogs.msdn.com/jaredpar/archive/2009/03/31/is-it-serializable.aspx