Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 子类化和数据契约_C#_Wcf - Fatal编程技术网

C# 子类化和数据契约

C# 子类化和数据契约,c#,wcf,C#,Wcf,我正在使用以下代码: [ServiceContract] public interface IUserAccountService { [OperationContract] UserAccountResponse CreateNewUserAccount(UserAccountRequest userAccountRequest); } public abstract class BaseResponse { public bool Success { get; se

我正在使用以下代码:

[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; }
}
我的问题是:

  • 我是否需要将DataContract属性同时添加到抽象类和子类中
  • 如果抽象类不需要DataContract属性,我可以将DataMember属性添加到其属性中吗

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

    从:


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

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

    从:


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

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

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

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

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

    当我遇到这样的问题时,使用WCF,我喜欢使用一个名为soapui的工具发出请求并查看结果。如果您弄错了,您将在请求和响应中看到缺少的XML。我从最少的属性开始,并根据需要添加它们。我使用免费版本,它已经成为任何与SOAP相关的开发中我必须使用的工具。当我有类似的问题时,使用WCF,我喜欢使用一个名为soapui的工具来发出请求并查看结果。如果您弄错了,您将在请求和响应中看到缺少的XML。我从最少的属性开始,并根据需要添加它们。我使用免费版本,它已经成为我在任何SOAP相关开发中必须使用的工具。