DataContractSerializer以与KnownTypes和Generics混淆的方式运行

时间:2014-04-21 01:55:33

标签: c# generics reflection datacontractserializer known-types

我正在尝试为任意对象生成KnownType列表,并且在尝试使用泛型成员序列化类型时遇到问题,例如DbEntityValidationException具有类型为IEnumerable<DbEntityValidationResult>的列表属性

当调用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<object>而不是List<DbEntityValidationResult>

System.Runtime.Serialization.SerializationException: Type 'System.Collections.Generic.List``1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' with data contract name 'ArrayOfanyType:http://schemas.microsoft.com/2003/10/Serialization/Arrays' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

为什么DataContractSerializer在没有使用该类型时会抱怨这种类型,当我提供实际的类型时?

1 个答案:

答案 0 :(得分:0)

可能在对象图中的某个位置,List&lt; {object}&gt;需要序列化。

DataContractSerializer看到List&lt; {object}&gt;与List&lt; {any other type}&gt;不同因此typeof(List&lt; {object}&gt;)必须是传递给DataContractSerializer构造函数的Type之一。

尝试一下,看看它是否有帮助。