c#,为什么XmlSerializer序列化基对象而不是接口
本文关键字:接口 对象 为什么 XmlSerializer 序列化 | 更新日期: 2023-09-27 17:50:21
为什么XmlSerializer
在序列化ICar
时要序列化Car
的全部?..而不是仅仅从ICar
序列化A
?
我发现这很奇怪,因为当我在调试器中观看这个时,icars
只包含A
,但test.xml
有A
, B
和C
。
示例代码:
//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>
因为您创建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;
}
}