我正在使用DataContractSerializer
序列化泛型类型。一直有效,直到一个类碰巧具有两个已知类型,这是具有不同接口作为泛型参数的泛型的两个版本。
这是我可以匆匆拍打的最简单的例子。有两个接口(IInterfaceA
和IInterfaceB
),由某些类型(ImplementationA
和ImplementationB
)实现。有一个通用类型Generic<T>
,它实现了其他一些接口IOtherInterface
。还有我要序列化的类HereComesTrouble
,其中包含该接口的两个数据成员。
我已经使用KnownType
属性列出了序列化对象图中可能出现的所有可能的具体类型。未列出Generic<ImplementationA>
和Generic<ImplementationB>
,因为这些类型将永远不存在。
这是运行代码时收到的InvalidOperationException
的消息:
类型'Test.Generic`1 [Test.IInterfaceB]'无法添加到 已知类型,因为另一个类型为'Test.Generic`1 [Test.IInterfaceA]' 相同的数据合同名称 “ http://schemas.datacontract.org/2004/07/Test:GenericOfanyType”是 已经存在。如果某个特定商品有不同的收藏 类型-例如List和Test [],则不能同时添加它们 作为已知类型。考虑只为这些类型指定一种 除了已知类型列表。
我应该如何解决此问题?
using System.IO;
using System.Runtime.Serialization;
namespace Test
{
internal interface IInterfaceA { }
internal interface IInterfaceB { }
[DataContract]
internal class ImplementationA : IInterfaceA { }
[DataContract]
internal class ImplementationB : IInterfaceB { }
internal interface IOtherInterface { }
[DataContract]
internal class Generic<T> : IOtherInterface
{
[DataMember]
public T GenericData { get; set; }
}
[DataContract]
[KnownType(typeof(ImplementationA))]
[KnownType(typeof(ImplementationB))]
[KnownType(typeof(Generic<IInterfaceA>))]
[KnownType(typeof(Generic<IInterfaceB>))] // <-- Removing this one line makes everything work.
internal class HereComesTrouble
{
[DataMember]
public IOtherInterface Member1 { get; set; }
[DataMember]
public IOtherInterface Member2 { get; set; }
}
internal class Program
{
private static void Main(string[] args)
{
var toSerialize = new HereComesTrouble();
var serializer = new DataContractSerializer(typeof(HereComesTrouble));
using (var memoryWriter = new MemoryStream())
serializer.WriteObject(memoryWriter, toSerialize); // <-- InvalidOperationException!
}
}
}