微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WCF ReadOnlyDictionary的奇怪序列化

如何解决WCF ReadOnlyDictionary的奇怪序列化

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

我想使对象不可变,因此-将其所有值类型字段更改为具有私有设置程序,并将字典更改为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?

解决方法

要解释这一点,我们需要使用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 举报,一经查实,本站将立刻删除。