2011-04-07 96 views
3

我不明白爲什麼我們不能序列化從接口派生的具體類。具體類的屬性仍然是已知的!爲什麼我們不能序列化從接口派生的具體類?

public interface IThing 
{ 
    string Name { get; } 
} 

[XmlRoot] 
public class RealThing : IThing 
{ 
    [XmlAttribute] 
    public string Name { get { return "Real Thing"; } set{ /* Do something. */ } } 
} 

我已經告訴了XmlSerializer如何處理實現的屬性做,爲什麼這樣不行?爲什麼XmlSerializer甚至會看界面?

我已經做了大量的可序列化的類,現在正在運行。過去我所做的數百個可序列化類中是否可能實現了一個接口?

+0

唯一的錯誤我與該類得到的是,這是不公開。你有什麼具體的錯誤嗎? – 2011-04-07 20:01:04

+0

反正有什麼錯誤?我只是運行這個代碼並按預期工作。 (Name屬性不會被序列化,因爲它沒有setter) – 2011-04-07 20:08:23

+1

它看起來像我忽略了在我的問題中包含最重要的細節 - 這是RealThing實際上是列表,IThing - 這是問題現在很明顯。請忽略! – 2011-04-07 20:16:50

回答

9

你當然可以序列化一個繼承了接口的類。但是你不能告訴序列化程序到序列化接口,因爲它不知道在反序列化中實例化哪個具體類。

換句話說系列化會的工作,如果你實例化序列化是這樣的:

XmlSerializer ser = new XmlSerializer(typeof(RealThing)); 
ser.Serialize(new MemoryStream(), new RealThing()); 

此外,您將需要RealThing一個公共類,因爲這是由Xmlserializer要求。

+0

是的,我錯誤地鍵入我的例子。但這也不再是一個問題 - 請參閱我的主要意見爲什麼(我忽略了重要部分)。謝謝。 – 2011-04-07 20:17:41

4

你的財產需要一個二傳手。 XML序列化程序僅序列化公共讀/寫屬性。

+0

是的,這是我的例子中的一個錯誤,並沒有造成潛在的問題。不過謝謝。 – 2011-04-07 20:00:24

0

我剛剛用XmlSerializer對RealThing進行了序列化。

無論你的問題是,我不認爲這是因爲RealThing實現一個接口...

相關問題