C# 使用接口而不是具体类型IEnumerable会导致异常

C# 使用接口而不是具体类型IEnumerable会导致异常,c#,.net,serialization,C#,.net,Serialization,最好使用接口,而不是concrate类型,这样我们的应用程序将具有模块性,可以自由地使用任何所需的类型(只要它实现了接口) 因此,我在Worker对象中创建了IEnumerable类型的CarNumbers成员: [DataContract(Namespace = "", Name = "Worker")] public class Worker { .... .... [DataMember(IsRequired = false, Name = "CarNumbers"

最好使用接口,而不是concrate类型,这样我们的应用程序将具有模块性,可以自由地使用任何所需的类型(只要它实现了接口)

因此,我在Worker对象中创建了IEnumerable类型的CarNumbers成员:

[DataContract(Namespace = "", Name = "Worker")]
public class Worker {
    ....
    ....
    [DataMember(IsRequired = false, Name = "CarNumbers")]
    public IEnumerable<string> CarNumbers  { get; set; }
    ....
}
[DataContract(Namespace=”“,Name=“Worker”)]
公社工人{
....
....
[DataMember(IsRequired=false,Name=“CarNumbers”)]
公共IEnumerable卡号{get;set;}
....
}
现在,我正在尝试将Worker对象序列化为XML,但出现了异常:

无法序列化System.Collections.Generic.IEnumerable`1[[string]]类型的成员Worker.CarNumbers,因为它是一个接口


如何在不破坏Independecy和使用concrate类型的情况下解决此异常?

这取决于序列化程序。一般来说,序列化需要能够创建具体的类型(否则,当反序列化时,它如何知道实际创建什么?您不能只创建一个接口的实例…),所以您必须将一些抽象泄漏到某个地方


综上所述,使用允许您从代码角度执行所需操作,尽管它所做的只是在序列化输出中持久化所需的具体类型。

实例化卡号的可能类型候选是什么?如果只有一个候选人,比如说,列表,那么使用它可能会更好directly@Sergey库德里亚夫采夫:它可以是列表、数组等等。请看这个问题的答案。还有其他相关问题需要回答。但一般来说,您必须更改该类型或提供一些自定义序列化代码。您的意思是什么?当我们需要这种抽象时,我们经常在代码中使用它,而不是常规的DataContractSerializer。你说得对!我使用了DataContractSerializer,但它不起作用。NetDataContractSerializer工作得很好。DataContractSerializer和NetDataContractSerializer之间有什么区别?首先,请查看序列化输出。