2015-05-28 20 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的* exact *相同版本需要再次可用。 –

回答

-1

如果不知道類的實際類型,則無法反序列化。

+1

您可以_can_生成一個動態類型,雖然(它實現了接口)並反序列化。 –

+0

完全可以使用反射來做到這一點。在可編譯的時間「瞭解」是沒有必要的。 – David

2

BinaryFormatter將關於類型的信息保存到二進制流中。它使用該信息在反序列化期間重建對象圖。所以,你可以在不知道它包含哪個對象的情況下反序列化流。

但是,序列化的所有具體類都應該在反序列化期間加載。實際上,這意味着保存它們的程序集應該位於應用程序文件夾,GAC中,或者通過其他方式加載到內存中。

formatter.Deserialize只返回object,您可以將其轉換爲接口或具體類型。

+1

BinaryFormatter的另一個重要注意事項是反序列化的類也必須被BinaryFormatter視爲「相同版本」。如果它檢測到元數據差異,它將無法反序列化。 –

相關問題