首页 > 解决方案 > 通过 WCF 调用传递继承的“数据协定”?

问题描述

我的 WCF 端点之一具有此方法:

GetData(DataTable dt)

我试图在继承自 DataTable 类的客户端上创建一个类

public class ExtendedDataTable : DataTable{
  //...implementation
}

并将其与端点调用一起传递:

GetData(new ExtendedDataTable());

然后我得到了SerializationException。根据错误,它建议我使用DataContractResolverKnownType属性。

我不想使用 KnownType,因为我不应该每次有人决定继承我的 DataContract 时都更新端点。我无法编写任何 DataContractResolver,因为我没有扩展 DataTable 类的确切结构。 是否可以从客户端扩展 DataContract?如果是这样,最佳做法是什么?

谢谢!

标签: wcfinheritanceserializationdatacontract

解决方案


我不推荐使用Datatable,它让WCF很容易出现客户端和服务器序列化的问题,比如需要指定表名。最好使用自定义数据类型,我们可以使用带有 KnownType 属性的继承类型。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-known-types
在我这边,我不能使用继承的数据表,而我可以使用任意使用 Knowntype 属性的自定义类。
请参考我的代码段。

        [DataContract]
    [KnownType(typeof(Product))]
   public class MyData
    {
        [DataMember]
        public ProductBase Product { get; set; }
    }


    [DataContract]
    public class ProductBase
    {
        [DataMember]
        public int ID { get; set; }
    }
    [DataContract]
    public class Product : ProductBase
    {
        [DataMember]
        public string Name { get; set; }

    }

推荐阅读