0

是否有任何开关指示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 个属性的 order 属性DataMemberAttribute也总是被省略,并且 aMessageContract省略了IDisposable实现。

4

2 回答 2

1

在 DataMember 属性上使用 name 属性

如:

[DataMember(Name="myname")]
于 2012-08-29T10:20:45.217 回答
1

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

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

  • 补充:克里斯所说的:有了[DataMember(Name="whateveryouwant")]你就可以设置一个不同于字段/属性名称的名称。虽然我不喜欢这样的用法,但它在重构代码时很有帮助,但仍然保持 API 兼容。

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

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

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

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

于 2012-08-29T10:21:26.870 回答