使用svcutil生成代理期间的DataContract属性名称

时间:2012-08-29 10:08:10

标签: wcf svcutil.exe

是否有任何开关指示svcutil使用代码中定义的名称生成DataContract属性?例如,当我创建使用以下DataContract的代理时:

[DataContract(Namespace = "http://schemas.mynamespace.com/2012/08")]
public class MyDataContract
{
    [DataMember(IsRequired = true, Order = 0)]
    private int _id;

    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }
}

我在代理生成的类上得到了这个DataContract

public partial class MyDataContract : object
{                
    private int _idField;

    [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
    public int _id
    {
        get
        {
            return this._idField;
        }
        set
        {
            this._idField = value;
        }
    }
}

对于前3个属性,DataMemberAttribute的order属性总是被省略,而MessageContract省略IDisposable实现。

2 个答案:

答案 0 :(得分:1)

在DataMember属性

上使用name属性

如:

[DataMember(Name="myname")]

答案 1 :(得分:1)

好吧,我无法对省略的order发表评论,但我可以帮助完成剩下的工作:

  • 通常在属性上指定DataMember属性,而不是在字段上。数据契约本身不区分属性和字段,但它知道名称,类型,是否是必需的等等。

  • 已添加:Chris说的是:使用[DataMember(Name="whateveryouwant")],您可以设置与字段/属性名称不同的名称。我不喜欢这样的用法,但是在重构代码时它很有用,但仍然保持API兼容。

  • 只有其他DataContract(以及一些内在支持的)类型被序列化到/来自消息。 IDisposable似乎不是一个。

  • 序列化IDisposable的继承MessageContract没有任何意义。消息契约是SOAP消息的.NET表示。除了在SOAP消息XML中的内容和可访问的.NET类型之间提供1:1映射之外,它没有别的办法。

    消息是ServiceContract的一部分,因为它指定必须将哪种消息发送到某个操作才能成为有效调用,而另一个(响应)消息合同指定数据如何,即操作返回,将是结构化的。没有其他的;它是一个数据聚合。

如果要在客户端捕获服务操作的结果,并且为方便起见,在超出范围时自动发回消息(或者例如从服务中取消注册),则必须在客户端。但请注意,服务不得要求发生这种情况(由于连接丢失,崩溃等)。