2011-04-18 58 views
1

爲什麼XmlSerializer在連載ICar時序列化全部爲Car? ..不僅僅是從ICar序列化AC#,爲什麼XmlSerializer會序列化基礎對象而不是接口?

我覺得這很奇怪,因爲我看這個在調試的時候,icars僅包含A,但test.xmlABC

示例代碼:

//IMPLEMENTATION 
Cars cars = new Cars(); 

ICars icars = cars; 

var iXmls = new XmlSerializer(typeof(Cars)); 
using (TextWriter iTw = new StreamWriter("test.xml")) 
{ 
    iXmls.Serialize(iTw, icar); 
} 

//CLASS 
[XmlRootAttribute("Cars")] 
public class Cars : ICar 
{ 
    private string _A = "Car A"; 
    private string _B = "Car B"; 
    private string _C = "Car C"; 

    public string A { /* get.. set.. */} 
    public string B { /* get.. set.. */} 
    public string C { /* get.. set.. */} 
} 

//INTERFACE 
public interface ICars 
{ 
    string A; 
} 

XML結果:

<Cars> 
    <A>Car A</A> 
    <B>Car B</B> 
    <C>Car C</C> 
<Cars> 

期待得到這個(但沒有):

<Cars> 
    <A>Car A</A> 
<Cars> 
+0

序列化僅適用於具體的類型,而接口只定義的行爲(沒有狀態)......您可能需要使用抽象類,而不是達到你在找什麼.. – sajoshi 2011-04-18 03:27:32

+0

@sajoshi因爲你不能有一個抽象類的實例,你也不能序列化到/從它。 – 2011-04-18 12:20:56

回答

3

因爲你創建XmlSerializer傳遞typeof(Cars)到它是構造函數。 XmlSerializer不能用於接口類型。

如果您想忽略某些字段,則可以在班級中使用System.Xml.Serialization.XmlIgnoreAttribute。請參閱this post

+0

你知道我怎樣才能以相同的方式繼承這些值,而無需創建一個手動初始化這些變量的新類? – PiZzL3 2011-04-18 02:57:38

+1

@ PiZzL3你在談論反序列化嗎?如果是這樣,請參閱http://msdn.microsoft.com/en-us/library/he66c7f1.aspx – 2011-04-18 02:59:41

+0

我知道ingore交易。我只是在製作一種更加動態的方式來保存東西(比如,如果我想保存所有東西,只需要幾個不同的分組/組合)。 – PiZzL3 2011-04-18 03:14:25

1

你不能反序列化爲ICar,那麼你爲什麼期望從ICar序列化?

只是做一個簡單的類型,做你所需要的。

public class PlainOldCar : ICar 
{ 
    public string A {get;set;} 
    public PlainOldCar(ICar carSource) //copy constructor 
    { 
    this.A = carSource.A; 
    } 
} 
+0

我真的不知道我無法反序列化到ICar。接口對我來說是非常新的。不幸的是,我試圖避免的方法。 – PiZzL3 2011-04-18 03:18:04

相關問題