基于抽象基类及其子类的WCF数据契约

本文关键字:子类 WCF 契约 数据 基类 于抽象 抽象 | 更新日期: 2023-09-27 17:49:36

我有一个监控应用程序,通过WCF接收来自其他应用程序的处理更新。以前被监控的应用程序有一个"更新"类来发送数据到监控应用程序。现在我正在编写一个抽象基类,看起来像这样

public abstract class Update
{
    public readonly DateTime TimeStamp;
    public readonly int      AppId;
    public Update()
    {
        TimeStamp = DateTime.Now;
        AppId = SomeMethodThatCalculatesId();
    }
    private int SomeMethodThatCalculatesId()
    {
        // my calculations ...
    }
}

下面是一个示例子类

public class ProcessUpdate : Update
{
    public readonly string ProcessMessage;
    public ProcessUpdate(string processMessage) : base()
    {
        if (string.IsNullOrEmpty(processMessage))
        {
            throw new ArgumentNullException("processMessage");
        }
        ProcessMessage = processMessage;
    }
}

我希望能够发送任何来自Update的监控应用程序,并希望防止更新被实例化,这就是为什么它是抽象的。我想要一个实现为我的AppId生成和派生类不担心它或改变它,这就是为什么AppId是只读的。

Update需要DataContract属性标签还是只需要我的子类?如果是这样的话,我仍然可以用DataMemeber装饰TimeStampAppId,而不使用DataContract,并且仍然可以在监控应用程序中访问这些属性吗?

基于抽象基类及其子类的WCF数据契约

我认为WFC的建议是通过接口进行通信。在你的情况下,这意味着使TimeStampAppId的接口属性(用DataContract装饰)和DataMember装饰它们,然后你应该在Update实现这个接口。

在你所说的情况下,如果你想在WCF上看到Update对象,那么你需要用DataContract来装饰它,如果你想能够看到只读字段,那么你需要用DataMember来装饰它们。

您可以使用ServiceKnownType标记服务,以告诉客户端有关子类的信息,这将使它在发送update派生的内容时能够工作。

至于在客户端将Update标记为抽象,如果您使用基于XML的服务则不是。另一方面,它不把Update看作抽象的

必须将所有类标记为DataContract,并将所有想要传输的成员标记为DataMember。此外,您必须使用NetDataContract序列化器,否则您将无法通过WCF传输类层次结构或接口。

使用NetDataContractSerializer的示例:WCF . NetDataContractSerializer