Я пытаюсь создать списки 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<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 будет жаловаться на этот тип, если этот тип не используется, и когда я предоставил тип, который на самом деле используется?