WCF 奇怪的 ReadOnlyDictionary 序列化

Posted

技术标签:

【中文标题】WCF 奇怪的 ReadOnlyDictionary 序列化【英文标题】:WCF strange serialization of ReadOnlyDictionary 【发布时间】:2021-02-13 14:06:24 【问题描述】:

我正在使用 WCF 服务引用(wsdl 在客户端生成),它公开了一个 API 函数,其中包含一个 [DataMember] Dictionary 类型的对象 [DataContract]。该对象在客户端和服务器端看起来都是一样的,并且现在在客户端和服务器端的许多地方都使用它。

我想让对象不可变,因此 - 将其所有值类型字段更改为具有私有 setter,并将字典类型更改为 ReadOnlyDictionary。在服务器端一切都很好——它确保没有人可以更改字典,但是当我从客户端更新服务引用时,它生成了一个奇怪的类型——这就是它在 reference.cs 中的样子:

[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?

【问题讨论】:

【参考方案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 奇怪的行为

WCF 奇怪的 ReadOnlyDictionary 序列化

使用 wcf 对 sql server 运行查询时出现奇怪的错误

WCF IIS Web 服务奇怪的间歇性结果

web 调用WCF 每次都要重新编译才能正常使用 终于解决了

WCF 服务返回无法理解的错误消息