如何解决WCF ReadOnlyDictionary的奇怪序列化
我正在使用WCF服务引用(wsdl是在客户端生成的),它公开了带有对象[DataContract]的API函数,该对象包含[DataMember] Dictionary
我想使对象不可变,因此-将其所有值类型字段更改为具有私有设置程序,并将字典更改为ReadOnlyDictionary
[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进行客户端代码创建。这不是一个魔术操作,而是逐步完成的。
当您添加对WCF(或任何其他类型的SOAP服务)的引用时,您实际上是在下载WSDL文件,并且自动生成的代码遵循该文件。 WSDL@w3schools
WSDL代表Web服务描述语言
WSDL用于描述Web服务
WSDL用XML编写
WSDL是2007年6月26日以来的W3C建议。
WSDL和客户端代码创建的复杂性得到了很好的解释here
因为使用System.Collections.Generic.Dictionary可能意味着您知道,如果您使用其他平台,则不能保证可以进行客户端表示。 无法使用WSDL / XSD有意义地传达.NET字典类的语义。
由于字典只是一个“简单的” XML转换,因此实际上没有任何有意义的方式将只读信息传递给客户端。客户端实际上也没有理由将其设置为只读,这仅仅是出于序列化的原因。当该值到达服务器端时,它将是只读的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。