C# WCF ReadOnlyDictionary的奇怪序列化
我使用的是WCF服务引用(wsdl是在客户端生成的),它公开了一个API函数和一个包含[DataMember]字典类型的对象[DataContract]。这个对象在客户端和服务器端看起来都是一样的,现在在客户端和服务器端的许多地方都在使用它 我想使对象不可变,因此-将其所有值类型字段更改为具有私有setter,并将字典更改为ReadOnlyDictionary类型。在服务器端,一切正常-它确保没有人可以更改字典,但是当我从客户端更新服务引用时,它生成了一个奇怪的类型-这是它在reference.cs中的外观:C# WCF ReadOnlyDictionary的奇怪序列化,c#,wcf,serialization,C#,Wcf,Serialization,我使用的是WCF服务引用(wsdl是在客户端生成的),它公开了一个API函数和一个包含[DataMember]字典类型的对象[DataContract]。这个对象在客户端和服务器端看起来都是一样的,现在在客户端和服务器端的许多地方都在使用它 我想使对象不可变,因此-将其所有值类型字段更改为具有私有setter,并将字典更改为ReadOnlyDictionary类型。在服务器端,一切正常-它确保没有人可以更改字典,但是当我从客户端更新服务引用时,它生成了一个奇怪的类型-这是它在reference.
[System.Runtime.Serialization.DataMemberAttribute()]
public SampleClient.RateDataService.ReadOnlyDictionaryOfstringdateTime Timestamps {
get {
return this.TimestampsField;
}
set {
if ((object.ReferenceEquals(this.TimestampsField, value) != true)) {
this.TimestampsField = value;
this.RaisePropertyChanged("Timestamps");
}
}
}
因此,在客户端,它实际上是一个奇怪的“ReadOnlyDictionaryOfstringdateTime”类型的对象,其中包含一个名为“m_dictionary”的成员,该成员属于dictionary类型,因此,该字段不再是不变的。为什么WCF在客户端不使用相同的类型?有没有办法将其序列化为ReadOnlyDictionary?为了解释这一点,我们需要使用WCF创建客户端代码。这不是一个神奇的操作,但它是通过步骤实现的 当您添加对WCF(或任何其他类型的SOAP服务)的引用时,您实际上是在下载一个WSDL文件,并且自动生成的代码依附于该文件 WSDL代表Web服务描述语言 WSDL用于描述web服务 WSDL是用XML编写的 WSDL是W3C 26年的建议。2007年6月 WSDL和客户机代码创建的复杂性已经得到了很好的解释 因为使用System.Collections.Generic.Dictionary可能意味着您知道,如果您使用的是其他平台,则无法保证客户端表示是可能的使用WSDL/XSD无法有意义地传达.NET字典类的语义。
因为您的字典只是一个“简单”的XML翻译,所以实际上没有什么有意义的方法将它是只读的信息传递给客户机。客户机也没有理由将其设置为只读,因为这只是出于序列化的原因。当值到达服务器端时,它将是只读的。客户端是使用回调(这是一种双工通信)接收这些对象的使用者,因此我希望此字典在两侧都是只读的,以防止对其进行任何更改