子类化和数据合同

时间:2011-11-24 01:31:56

标签: c# wcf

我正在使用以下代码:

[ServiceContract]
public interface IUserAccountService
{
    [OperationContract]
    UserAccountResponse CreateNewUserAccount(UserAccountRequest userAccountRequest);
}

public abstract class BaseResponse
{
    public bool Success { get; set; }
    public string Message { get; set; }
}

public class UserAccountResponse : BaseResponse
{
    public int NewUserId { get; set; }
}

我的问题是:

  1. 我是否需要将DataContract属性添加到抽象类和子类中?
  2. 如果抽象类不需要DataContract属性,我可以将DataMember属性添加到其属性中吗?

2 个答案:

答案 0 :(得分:1)

如果希望序列化基类中的项,则必须将DataContract应用于基类,并将DataMember应用于要在基类中序列化的项。但是,如果您不希望序列化基类中的任何内容,则不需要在基类上指定DataContract。

来自MSDN documentation

“将DataContractAttribute应用于基类时,派生类型不会继承属性或行为。但是,如果派生类型具有数据协定,则基类的数据成员将被序列化。但是,您必须将DataMemberAttribute应用于派生类中的新成员,以使它们可序列化。“

答案 1 :(得分:0)

是的,您必须在BaseResponse和UserAccountResponse上使用[DataContract]。您还必须为每个子类使用[KnownType]属性,如下所示。

[KnownType(typeof(UserAccountResponse))]
[DataContract]
public abstract class BaseResponse
{
...
}