c#,为什么XmlSerializer序列化基对象而不是接口

本文关键字:接口 对象 为什么 XmlSerializer 序列化 | 更新日期: 2023-09-27 17:50:21

为什么XmlSerializer在序列化ICar时要序列化Car的全部?..而不是仅仅从ICar序列化A ?

我发现这很奇怪,因为当我在调试器中观看这个时,icars只包含A,但test.xmlA, BC

示例代码:

//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 Results:

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

期待得到这个(但没有):

<Cars>
    <A>Car A</A>
<Cars>

c#,为什么XmlSerializer序列化基对象而不是接口

因为您创建XmlSerializer时将typeof(Cars)传递给它的构造函数。XmlSerializer不能在接口类型上工作。

如果想忽略某些字段,可以在类中使用System.Xml.Serialization.XmlIgnoreAttribute

你不能反序列化到ICar,那么你为什么期望从ICar序列化呢?

只需要创建一个简单的类型就可以了。

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