【问题标题】:DataContract properties names during proxy generation with svcutil使用 svcutil 生成代理期间的 DataContract 属性名称
【发布时间】:2012-08-29 18:21:26
【问题描述】:

是否有任何开关指示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;
        }
    }
}

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

【问题讨论】:

    标签: wcf svcutil.exe


    【解决方案1】:

    好吧,我不能对省略的order 发表评论,但我可以帮助解决其余的问题:

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

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

    • 只有其他 DataContract(和一些本质上支持的)类型会序列化到消息/从消息序列化。 IDisposable 好像不是一个。

    • 序列化继承自 IDisposable 的 MessageContract 没有任何意义。消息契约是 SOAP 消息的 .NET 表示。除了提供 SOAP 消息 XML 中的内容和可访问的 .NET 类型之间的 1:1 映射外,它实际上没有其他事情可做。

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

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

    【讨论】:

    • 啊,对。这也在 WCF 的关于 IDisposable 实现的原则中指定。我傻了,不去想。关于Property 名称,这是首选方式吗?只有公共Properties 将在不使用私有字段的情况下应用DataContractAttribute,或者保留私有字段并直接在Property 上应用attr?
    • 再想一想,保留私有字段没有意义,因为Attribute 应用于Property,是吗?
    • 我建议只使用普通的自动属性。为什么?上次我检查时,WCF 无法使用完全不可变的 DataContract 类型,而不变性是自己写出私有(只读)字段的最常见原因(当然还有其他一些,如缓存魔术等)。
    【解决方案2】:

    在 DataMember 属性上使用 name 属性

    如:

    [DataMember(Name="myname")]
    

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多