2010-04-22 22 views
2

我有一個很奇怪的例外,在我的C#應用​​程序:嘗試反序列化包含一個通用List<IListMember>(其中由接口指定列表項),拋出一個異常報告一個類時「類型... IListMember沒有標記可序列化屬性」(措辭可能略有不同,我的VisualStudio不是英文版)。接口「未標有序列化屬性」異常

現在,接口不能串行化。實際包含在列表中的類,實現IListMember,[Serializable];是的,我已經檢查過,IListMember實際上被定義爲一個接口,並不意外地作爲一個類!

我試圖再現只含含列表和成員的類一個單獨的測試項目中的例外,但它系列化,並愉快地反序列化:/

沒有人有可能是什麼什麼好主意?

編輯:

我們使用的是BinarySerializer;我再說一遍,當提取到一個測試項目時,這個班會愉快地序列化。所以,我並不需要一個解決辦法來序列包含List<IThing>一類,一般能正常工作(只要實施IThing實際類是可序列化);我所尋找的是原因,它可能工作這個特定時刻......

現在我已經放在一個解決方法(與條目數分別各序列化列表成員一起,並重新創建List通過手),但真的想找出它可能爲未來的參考。

+2

你在使用什麼串行器? 'BinaryFormatter'? 'XmlSerializer'? 'DataContractSerializer'? 「鮑勃的本土有機串行器」? 另外 - 是否有任何'事件涉及? – 2010-04-22 22:17:47

+0

看我的編輯;是的,在導致調用binaryFormatter.Deserialize的行的某處會有事件發生;你看到任何連接? – 2010-04-26 06:55:08

+0

該接口用於確定類是否表示可以序列化,如果有一個基於接口的引用列表,其中接口未標記爲可序列化,也許序列化代碼試圖告訴您可能有序列化對象在這裏,它無法處理?即使你當前的對象圖是A-OK。 – 2010-04-26 07:40:20

回答

-1

簡單的方法(雖然醜陋)總結列表:

public ListMemberCollection : List<IListMember>, ISerializable 
{ 
    // Implement ISerializable Here 
} 

另類的方式(雖然更好)AbstractBaseClass:

[Serializable] 
public ListMemberBase : IListMember 
{ 
    // Implement abstract versions of everything 
} 

一種可能性?:(您的其他類)

class TheClassYoureSerializing 
{ 
    [Serializable] 
    public List<IListMember> list { get; set; } 
} 
+0

我不明白。實現IListMember **的類是** [Serializable] - 爲什麼我想創建一個額外的抽象基類? – 2010-04-26 07:03:02

2

不要緊該類支持的接口是可序列化。接口不能被序列化,句點。

爲了反序列化,序列化程序需要能夠實例化一個具體類型,它通過反映待反序列化的類的屬性來確定這個類型。

如果這些屬性中的一個的類型是一個接口,那麼它將永遠無法構建一個具體類型分配給該成員。它看到的只是接口,當數據序列化時,它不知道哪個類最初實現了它。

如果您希望類可序列化,然後在對象圖中每個類必須是具體類型。沒有接口允許。 (後記:其實,我有點撒謊,BinaryFormatter可以直接/從接口類型序列化/反序列化,但我強烈懷疑這不是什麼在這裏使用。)

+0

不是,不是真的;我們的確在使用BinaryFormatter;它確實可以序列化類,即使它們只通過接口聲明。類的**類型仍然是具體的類型,正如你所說,它適合反思;它僅在類屬性中通過接口聲明的事實不會改變這一點。 – 2010-04-26 06:58:46