2015-05-28 3 views
2

Скажем, у меня есть сериализованные байт экземпляра интерфейса, AnInterface, например, так:Можете ли вы десериализовать экземпляр интерфейса без определения его типа?

AnInterface instance = new ConcreteClass(); 
serializeToDatabase(instance); 

Можно ли сделать что-то вроде:

IFormatter formatter = new BinaryFormatter(); 
MemoryStream stream = new MemoryStream(); 
byte[] bytes = bytesSavedToDB; 
stream.Write(bytes, 0, bytes.Length); 
stream.Position = 0; 
AnInterface instance = (AnInterface) formatter.Deserialize(stream); 

без определения для ConcreteClass?

+4

Нет, вы не можете, вам нужен базовый тип. –

+0

Что мешает вам узнать тип сериализованного класса? – ryanyuyu

+0

BinaryFormatter использует Object.GetType(), вы не можете скрыть тот факт, что он действительно * является * ConcreteClass. Умышленно запутывание это не очень хорошая идея, вы действительно, действительно заботитесь о конкретном классе, если вы надеетесь, что десериализовать снова через год или на другой машине. В этот момент должна быть снова доступна * точная * та же версия ConcreteClass. –

ответ

-1

Вы не можете десериализовать это, не зная (реальный) тип класса.

+1

Вы _can_ генерируете динамический тип, хотя (который реализует интерфейс) и десериализуем это. –

+0

Это можно сделать с помощью отражения. «Знать» время компиляции не нужно. – David

2

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

Однако все конкретные классы, которые были сериализованы, должны быть загружаемыми во время десериализации. На практике это означает, что сборки, которые их удерживают, должны быть либо в папке приложения, либо в GAC, либо загружены в память другими способами.

formatter.Deserialize возвращает только object, что вы можете отличить от интерфейса или конкретного типа.

+1

Также важной записью для 'BinaryFormatter' являются классы, которые десериализуются, также должны считаться« той же версией »BinaryFormatter. Если он обнаруживает различия в метаданных, он не будет десериализован. –

Смежные вопросы