Wcf 自定义数据契约/数据成员名称

Wcf 自定义数据契约/数据成员名称,wcf,datacontract,datamember,Wcf,Datacontract,Datamember,我有以下问题。客户请求的web服务以以下格式返回数据: <status> <name1>Some name</name1> ... </status> 并且还定义了以下基类: [DataContract(Name="status")] public class StatusData { } 和两个驱动类: public class PatronStatusData : StatusData {

我有以下问题。客户请求的web服务以以下格式返回数据:

<status>
 <name1>Some name</name1>
 ...
</status>
并且还定义了以下基类:


    [DataContract(Name="status")]
    public class StatusData
    {

    }
和两个驱动类:


public class PatronStatusData : StatusData
{
        private string _name;
        [DataMember(Name = "name1", Order = 0)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        } 
...
}
以及:

问题是,当我从web服务中提取数据时,会忽略数据协定名称(“状态”)和数据成员的名称,并使用类型和属性的名称


可以使用客户名称吗?

您应该使用DataContract(Name=“Something”)来修饰UniloginFoundError和PatronStatusData,以实现这一功能。但不允许为它们设置相同的名称(“状态”)。 在您的特定情况下,我最好使用单个类,将未使用的属性设置为null

[DataContract(Name="status")]
public class StatusData
{
    private string _name;
    private string _errorDescription = null;


    [DataMember(Name = "name1", Order = 0, EmitDefaultValue=false)]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }


    [DataMember(Name = "error", Order = 1, EmitDefaultValue=false)]
    public string Description
    {
        get{ return _errorDescription ;}
        set {_errorDescription =value ;}
    }
...
}

您应该使用DataContract(Name=“Something”)来修饰UniloginFoundError和PatronStatusData,以实现这一点。但不允许为它们设置相同的名称(“状态”)。 在您的特定情况下,我最好使用单个类,将未使用的属性设置为null

[DataContract(Name="status")]
public class StatusData
{
    private string _name;
    private string _errorDescription = null;


    [DataMember(Name = "name1", Order = 0, EmitDefaultValue=false)]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }


    [DataMember(Name = "error", Order = 1, EmitDefaultValue=false)]
    public string Description
    {
        get{ return _errorDescription ;}
        set {_errorDescription =value ;}
    }
...
}

一般来说,想要对序列化数据契约生成的XML进行过多控制是错误的。这就是XML序列化程序的陷阱。用一般术语定义契约,让客户端只使用结果,这通常足够简单。

一般来说,想要对序列化数据契约生成的XML进行过多控制是错误的。这就是XML序列化程序的陷阱。用一般术语定义合同,让客户机直接使用结果,这通常足够简单。

请编辑问题以准确显示XML现在的样子。请编辑问题以准确显示XML现在的样子。+1是的,就是这样。如果您想更加清楚,还可以在DataMember属性中添加一个“IsRequired=false”,以明确这两个字符串都不是必需的。如果您想更加清楚,还可以在DataMember属性中添加一个“IsRequired=false”,以明确这两个字符串都不是必需的。

public class UniLoginNotFoundError : StatusData 
    {
        public UniLoginNotFoundError()
        { }

        private string _description = "UniLoginNotFoundError";
        [DataMember(Name = "error", Order = 0)]
        public string Description
        {
            get 
            {
                return _description;
            }

        }
    }
[DataContract(Name="status")]
public class StatusData
{
    private string _name;
    private string _errorDescription = null;


    [DataMember(Name = "name1", Order = 0, EmitDefaultValue=false)]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }


    [DataMember(Name = "error", Order = 1, EmitDefaultValue=false)]
    public string Description
    {
        get{ return _errorDescription ;}
        set {_errorDescription =value ;}
    }
...
}