DataContractSerializer与KnownTypes和Generics的行为方式令人困惑

本文关键字:方式令 KnownTypes Generics DataContractSerializer | 更新日期: 2023-09-27 17:59:04

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

当调用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<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在没有使用该类型的情况下,以及在我提供了实际的类型时,会抱怨该类型?

DataContractSerializer与KnownTypes和Generics的行为方式令人困惑

在对象图的某个地方,List<{object}>需要序列化。

DataContractSerializer看到List<{object}>不同于List<{任何其他类型}>,因此typeof(List<{object}>)必须是传递给DataContractSerializer构造函数的类型之一。

试试看是否有帮助。