C# WCF数据契约部分类 - 第二个部分类中的新字段未被捕获

3

我有一个WCF服务,其中包含一些数据合同。我正在使用Web服务软件工厂,它使用设计师创建所有消息、数据和其他合同,并将它们创建为部分类。当代码重新生成时,这些类将被重新创建。

using WcfSerialization = global::System.Runtime.Serialization;

[WcfSerialization::CollectionDataContract(Namespace = "urn:CAEService.DataContracts", ItemName = "SecurityItemCollection")]
public partial class SecurityItemCollection : System.Collections.Generic.List<SecurityItem>
{
}

数据协定是一个自定义类的通用列表,一直运行良好。但是现在我想要给这个类添加一个属性,所以我在同一个命名空间中添加了这个部分类:
public partial class SecurityItemCollection
{
    public int TotalRecords { get; set; }
}

这在服务端看起来很正常,但是当我从客户端编译并更新服务引用时,该类没有新属性。也就是说,在客户端序列化和重新创建时,缺少新属性。有人知道为什么吗?
谢谢
编辑: 好了,这真的让我抓狂。我唯一能看到的是它使用的是CollectionDataContract属性而不是DataContract。这是否意味着不能序列化类中的数据成员?为什么会这样?在服务端它正常工作 - 我可以看到并填充值,没有问题。然而当我在客户端更新服务引用时,什么都没有,只有不带数据成员的集合类。

当您在新属性上放置[DataContract]属性,然后重新生成代理时会发生什么? - slugster
嗨,slugster - 我尝试使用与第一个类相同的属性,但是我收到了一个错误:重复的“WcfSerialization :: CollectionDataContract”属性C:\ xxx \ CAEService.DataContracts \ SecurityItemCollection.cs。 - Ciarán Bruen
我还尝试将普通的[DataContract]属性分配给第二个类,这样编译通过了,但是当我发布服务时出现错误:带有CollectionDataContractAttribute属性的类型'CAEService.DataContracts.SecurityItemCollection'是无效的集合类型,因为它具有DataContractAttribute属性。 - Ciarán Bruen
3个回答

3
尝试给TotalRecords属性添加DataMember属性。

你确定这两个部分类在同一个命名空间中吗?为了验证,从其中一个类中删除 partial 关键字并进行编译。如果没有崩溃,它们就不在同一个命名空间中。 - Johann Blais
是的,我很确定。显然,在标记为CollectionDataContract的类中是不允许使用数据成员的...请参见我上面的答案。 - Ciarán Bruen

3

经过长时间的搜索,我终于发现这是不允许的,即标记为CollectionDataContract的类不能有数据成员。为什么会这样我不知道,但这让我浪费了几个小时并且头痛不已。请参见下面的链接:

WCF CollectionDataContract和DataMember


2

我知道这已经过时了,但当我搜索这个主题时它一直出现。通过在属性中添加 "DataMemberAttribute" 属性,我成功地使其工作。下面是一个代码示例。

public partial class SecurityItemCollection
{
    [global::System.Runtime.Serialization.DataMemberAttribute()]
    public int TotalRecords { get; set; }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接