【问题标题】:WCF strange serialization of ReadOnlyDictionaryWCF 奇怪的 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?

【问题讨论】:

    标签: c# wcf serialization


    【解决方案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 翻译,因此实际上没有任何有意义的方法可以将只读信息传递给客户端。客户端也没有理由将其设为只读,因为这只是出于序列化的原因。当值到达服务器端时,它将是只读的。

    【讨论】:

    • 客户端是一个消费者,它使用回调接收这些对象(这是一个双工通信),所以我希望这个字典只能在双方读取,以防止对其进行任何更改跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多