通过 WCF 调用传递继承的"Data Contract"?



我的一个 WCF 终结点具有此方法:

GetData(DataTable dt)

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

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

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

GetData(new ExtendedDataTable());

然后我得到了序列化异常。 根据该错误,它建议我使用DataContractResolverKnownType属性。

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

谢谢!

我不建议使用 Datatable,因为 WCF 很容易遇到客户端和服务器序列化问题,例如需要指定表名。最好使用自定义数据类型,我们可以将继承类型与 KnownType 属性一起使用。
https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-known-types 就我而言,我
不能使用继承的 Datatable,而我可以通过使用 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; }
}

您可以尝试继承 DataTable 并显式使用 DataContract 属性将其名称声明为"DataTable"。

但我不确定这种替换的目的。服务器端将只看到与原始数据协定相关的内容。即使序列化新属性,反序列化也仅适用于服务器端属性。除非将提供一些自定义反序列化。

在所有情况下,使用DataTable根本不是好主意,正如Abraham Qian已经指出的那样。

最新更新