假设我有一个接口实例的序列化字节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
的定义?
答案 0 :(得分:2)
BinaryFormatter将有关类型的信息保存到二进制流中。它使用该信息在反序列化期间重建对象图。因此,您可以在不知道它包含哪个对象的情况下反序列化流。
但是,在反序列化期间,所有已序列化的具体类都应该是可加载的。实际上,这意味着保存它们的程序集应该位于应用程序文件夹,GAC中,或者通过其他方式加载到内存中。
formatter.Deserialize
只返回object
,您可以将其转换为接口或具体类型。
答案 1 :(得分:-1)
如果不知道类的(真实)类型,则无法反序列化。