2011-04-18 48 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

相关问题