C# DataContractSerializer的行为与KnownTypes和泛型相混淆
我试图为任意对象生成KnownType列表,但在尝试使用泛型成员序列化类型时遇到问题,例如C# DataContractSerializer的行为与KnownTypes和泛型相混淆,c#,generics,reflection,datacontractserializer,known-types,C#,Generics,Reflection,Datacontractserializer,Known Types,我试图为任意对象生成KnownType列表,但在尝试使用泛型成员序列化类型时遇到问题,例如DbEntityValidationException,它的list属性类型为IEnumerable 调用DataContractSerializer的构造函数时,我会向其提供一个KnownTypes列表,该列表由以下类型组成,通过使用反射来获取其所有属性的类型以及任何泛型类型参数: var serializer = new DataContractSerializer(source.GetType(),
DbEntityValidationException
,它的list属性类型为IEnumerable
调用DataContractSerializer的构造函数时,我会向其提供一个KnownTypes列表,该列表由以下类型组成,通过使用反射来获取其所有属性的类型以及任何泛型类型参数:
var serializer = new DataContractSerializer(source.GetType(), knownsTypesPlusGenerics);
var stringWriter = new StringWriter(CultureInfo.InvariantCulture);
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
serializer.WriteObject(xmlTextWriter, source);
}
此列表由以下类型组成,通过跟踪捕获:
System.Data.Entity.Validation.DbEntityValidationException
System.Collections.Generic.List`1[[System.Data.Entity.Validation.DbEntityValidationResult, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
System.Collections.ListDictionaryInternal
System.Data.Entity.Validation.DbEntityValidationResult
然而,出于某种原因,DataContractSerializer抛出缺少的类型,就好像list属性的类型是list
,而不是list
:
System.Runtime.Serialization.SerializationException:Type'System.Collections.Generic.List``1[[System.Object,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]],数据协定名称为“ArrayOfanyType:http://schemas.microsoft.com/2003/10/Serialization/Arrays”他说。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORIGLASER的已知类型列表中。< /代码>
当DataContractSerializer没有使用该类型,并且我提供了实际使用的类型时,为什么DataContractSerializer会抱怨该类型?在对象图中的某个位置,列表可能需要序列化
DataContractSerializer认为List与List不同,因此typeof(List)必须是传递给DataContractSerializer构造函数的类型之一
尝试一下,看看是否有帮助。您是否有时间解决您的问题?