inheritance类的输出无效

我有2节课

[DataContract, KnownType(typeof(B))] public class A { [DataMember] public string prop1 { get; set; } [DataMember] public string prop2 { get; set; } [DataMember] public string prop3 { get; set; } } [DataContract] public class B : A { [DataMember] public string prop4 { get; set; } } 

以及以下方法:

 List BList = new List(); BList = new List() { new B() { prop1 = "1", prop2 = "2", prop3 = "3", prop4 = "4" } }; List AList = BList.Cast().ToList(); DataContractSerializer ser = new DataContractSerializer(typeof(List)); FileStream fs = new FileStream(@"C:\temp\AResult.xml", FileMode.Create); using (fs) { ser.WriteObject(fs, AList); } 

将其写入输出的XML文件:

   1 2 3 4  

怎么可能发生, prop4在结果范围内,我怎么能避免这种情况? prop4不是正在序列化的List一部分。

DataContractResolver允许您自定义DataContract的解析方式。 在这种情况下,您只需要将子类型解析为基本类型。

以下代码来自此博客文章。

https://blogs.msdn.microsoft.com/youssefm/2009/06/05/configuring-known-types-dynamically-introducing-the-datacontractresolver/

 public class DeserializeAsBaseResolver : DataContractResolver { public override bool TryResolveType(Type type, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace) { return knownTypeResolver.TryResolveType(type, declaredType, null, out typeName, out typeNamespace); } public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver) { return knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, null) ?? declaredType; } } 

根据框架,将上面的类传递给datacontract序列化程序,它应该为您提供所需的结果。

 DataContractSerializer ser = new DataContractSerializer(typeof(List));), null, Int32.MaxValue, false, false, null, new DeserializeAsBaseResolver ()); 

在C#中向下转换的一种简单方法是序列化子进程,然后将其反序列化为父进程。

 List BList = new List(); BList = new List() { new B() { prop1 = "1", prop2 = "2", prop3 = "3", prop4 = "4" } }; var serializedChildList = JsonConvert.SerializeObject(BList); List AList = JsonConvert.DeserializeObject>(serializedChildList); DataContractSerializer ser = new DataContractSerializer(typeof(List)); FileStream fs = new FileStream(@"C:\temp\AResult.xml", FileMode.Create); using (fs) { ser.WriteObject(fs, AList); } 

样本输出:

   1 2 3   

如果您还没有像其中一条评论中提到的那样自己完成,那么这里有一些我编写的代码。 我暂时没有使用AutoMapper ,所以我不记得并找出如何映射List类型。 无论如何,这里是小提琴:

 var list = new List { new B { prop1 = "1", prop2 = "2", prop3 = "3", prop4 = "4" } }; Mapper.Initialize(i => i.CreateMap()); using (var stream = new FileStream(@"output.xml", FileMode.Create)) { var serializer = new DataContractSerializer(typeof(List)); serializer.WriteObject(stream, list.Select(i => Mapper.Map(i)).ToList()); }