Passing an inherited “Data Contract” through WCF call?

家住魔仙堡 提交于 2019-12-25 01:34:23

问题


One of my WCF endpoints has this method:

GetData(DataTable dt)

I tried to create a class on the client that inherits from the DataTable class

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

and pass it along with the endpoint call:

GetData(new ExtendedDataTable());

Then I got the SerializationException. Accordingly to the error, it suggests that I use either DataContractResolver or the KnownType attribute.

I don't want to use the KnownType, because I shouldn't have to update the endpoint every time someone decides to inherit my DataContract. I can't write any DataContractResolver, because I didn't extend the exact structure of the DataTable class. Is it possible to to extend a DataContract from the client? If so, what's the best practice?

Thanks!


回答1:


I don't recommend using the Datatable, which makes it easy for WCF to have problems with client and server serialization, such as the need to specify a table name. It is best to use a custom data type, we can use the inheritance type with the KnownType attribute.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-known-types
On my side, I can't use the inherited Datatable, while I could use an arbitrary custom class by using Knowntype attribute.
Please refer to my code segments.

        [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; }

    }



回答2:


You can try to inherit DataTable and explicitly use DataContract attribute to declare it's name as "DataTable".

But I'm not sure about purpose of this replacement. Server side will see only what is related to original data contract. Even when new properties gets serialized, deserializatin will only work for server side properties. Unless some custom deserialization will be provided.

In all scenarios, using DataTable is not good idea at all as Abraham Qian already pointed out.



来源:https://stackoverflow.com/questions/57597247/passing-an-inherited-data-contract-through-wcf-call

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!