【问题标题】:DataContractSerializer behaves in confusing ways with KnownTypes and GenericsDataContractSerializer 的行为与 KnownTypes 和 Generics 混淆
【发布时间】:2014-04-21 01:55:33
【问题描述】:

我正在尝试为任意对象生成 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 在不使用该类型时会抱怨该类型,而当我提供了实际类型时?

【问题讨论】:

  • 您解决问题了吗?

标签: c# generics reflection datacontractserializer known-types


【解决方案1】:

您的对象图中的某处可能需要对 List 进行序列化。

DataContractSerializer 认为 List 与 List 不同,因此 typeof(List) 必须是传递给 DataContractSerializer 构造函数的类型之一。

试试看是否有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2015-05-05
    • 2014-07-09
    • 2018-04-29
    相关资源
    最近更新 更多