WCF DataContract在抽象基类及其子类上

时间:2011-04-08 19:21:58

标签: c# wcf

我有一个监控应用程序,通过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派生的任何内容,并希望阻止Update被实例化,这就是为什么它是抽象的。我想为我的AppId生成实现一个实现,并且派生类不需要担心或改变它,这就是AppId只读的原因。

Update是否需要DataContract属性标记,还是只需要我的子类?如果是这种情况,我是否仍然可以使用TimeStampAppIdDataMemeber而不使用DataContract并仍在监控应用中访问这些属性?

3 个答案:

答案 0 :(得分:1)

我认为WFC中的建议是通过接口进行通信。在您的情况下,这意味着制作界面的TimeStampAppId属性(使用DataContract修饰)并使用DataMember进行装饰,那么您应该在Update中实现此接口{1}}。

在您谈论的情况下,如果您希望能够在WCF上看到Update个对象,那么您需要使用DataContract来装饰它,如果您希望能够看到只读字段,然后你需要用DataMember装饰它们。

答案 1 :(得分:1)

您可以使用ServiceKnownType标记服务,告诉客户端子类,当您发送从更新派生的内容时,它应该可以使用它。

至于在客户端上将Update标记为抽象,而不是在使用基于XML的服务时。另一方面,它没有将Update视为抽象。

答案 2 :(得分:0)

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

有关使用NetDataContractSerializer的示例:WCF Net Data Contract Serializer