DataContractSerializer ведет себя запутанно с KnownTypes и Generics

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


person bwerks    schedule 21.04.2014    source источник
comment
Удалось ли вам решить вашу проблему?   -  person Eniola    schedule 22.04.2015


Ответы (1)


Возможно, где-то в вашем графе объектов нужно сериализовать List‹{object}>.

DataContractSerializer считает, что List‹{object}> отличается от List‹{любого другого типа}>, поэтому typeof(List‹{object}>) должен быть одним из типов, переданных конструктору DataContractSerializer.

Попробуйте это и посмотрите, поможет ли это.

person Eniola    schedule 27.10.2014