WCF 奇怪的 ReadOnlyDictionary 序列化
Posted
技术标签:
【中文标题】WCF 奇怪的 ReadOnlyDictionary 序列化【英文标题】:WCF strange serialization of ReadOnlyDictionary 【发布时间】:2021-02-13 14:06:24 【问题描述】:我正在使用 WCF 服务引用(wsdl 在客户端生成),它公开了一个 API 函数,其中包含一个 [DataMember] Dictionary
我想让对象不可变,因此 - 将其所有值类型字段更改为具有私有 setter,并将字典类型更改为 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
【问题讨论】:
【参考方案1】:为了解释这一点,我们需要使用 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 翻译,因此实际上没有任何有意义的方法可以将只读信息传递给客户端。客户端也没有理由将其设为只读,因为这只是出于序列化的原因。当值到达服务器端时,它将是只读的。
【讨论】:
客户端是一个消费者,它使用回调接收这些对象(这是一个双工通信),所以我希望这个字典只能在双方读取,以防止对其进行任何更改跨度>以上是关于WCF 奇怪的 ReadOnlyDictionary 序列化的主要内容,如果未能解决你的问题,请参考以下文章
WCF 奇怪的 ReadOnlyDictionary 序列化
使用 wcf 对 sql server 运行查询时出现奇怪的错误