将DataContractSerializer与以接口作为类型参数的通用已知类型一起使用

时间:2018-11-05 16:36:10

标签: c# .net wcf generics datacontractserializer

我正在使用DataContractSerializer序列化泛型类型。一直有效,直到一个类碰巧具有两个已知类型,这是具有不同接口作为泛型参数的泛型的两个版本。

这是我可以匆匆拍打的最简单的例子。有两个接口(IInterfaceAIInterfaceB),由某些类型(ImplementationAImplementationB)实现。有一个通用类型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!
        }
    }
}

0 个答案:

没有答案