C # десериализует неизвестный абстрактный класс - PullRequest
2 голосов
/ 03 апреля 2009

Я только знаком с основами сериализации, теперь у меня есть для этого применение. У меня есть существующая система отчетов с абстрактным классом ReportBase и несколькими отчетами, основанными на базовом классе. Каждый из них имеет различные параметры отчета, указанные в конструкторе, и иногда дополнительные методы. Можно ли сериализовать какой-либо из производных классов, а затем десериализовать, не зная тип производного класса.

В качестве альтернативы я мог бы сделать что-то с отражением для достижения этого. Я, вероятно, буду хранить сериализованные объекты в базе данных, поэтому я могу добавить класс отчета в другое поле, я полагаю.

1 Ответ

4 голосов
/ 03 апреля 2009

Да, безусловно, возможно десериализовать, не зная фактического типа объекта. На самом деле, вам не нужно ничего знать о типе, чтобы десериализовать. Десериализация в двоичном смысле просто преобразует массив байтов в исходный тип и возвращает ссылку как объект. Вы можете затем привести это к любому легальному типу для экземпляра.

Например, следующий код десериализует поток в объект и преобразует ссылку в тип 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

...