Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF ReadOnlyDictionary的奇怪序列化_C#_Wcf_Serialization - Fatal编程技术网

C# WCF ReadOnlyDictionary的奇怪序列化

C# WCF ReadOnlyDictionary的奇怪序列化,c#,wcf,serialization,C#,Wcf,Serialization,我使用的是WCF服务引用(wsdl是在客户端生成的),它公开了一个API函数和一个包含[DataMember]字典类型的对象[DataContract]。这个对象在客户端和服务器端看起来都是一样的,现在在客户端和服务器端的许多地方都在使用它 我想使对象不可变,因此-将其所有值类型字段更改为具有私有setter,并将字典更改为ReadOnlyDictionary类型。在服务器端,一切正常-它确保没有人可以更改字典,但是当我从客户端更新服务引用时,它生成了一个奇怪的类型-这是它在reference.

我使用的是WCF服务引用(wsdl是在客户端生成的),它公开了一个API函数和一个包含[DataMember]字典类型的对象[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?

为了解释这一点,我们需要使用WCF创建客户端代码。这不是一个神奇的操作,但它是通过步骤实现的

当您添加对WCF(或任何其他类型的SOAP服务)的引用时,您实际上是在下载一个WSDL文件,并且自动生成的代码依附于该文件

WSDL代表Web服务描述语言

WSDL用于描述web服务

WSDL是用XML编写的

WSDL是W3C 26年的建议。2007年6月

WSDL和客户机代码创建的复杂性已经得到了很好的解释

因为使用System.Collections.Generic.Dictionary可能意味着您知道,如果您使用的是其他平台,则无法保证客户端表示是可能的使用WSDL/XSD无法有意义地传达.NET字典类的语义。


因为您的字典只是一个“简单”的XML翻译,所以实际上没有什么有意义的方法将它是只读的信息传递给客户机。客户机也没有理由将其设置为只读,因为这只是出于序列化的原因。当值到达服务器端时,它将是只读的。

客户端是使用回调(这是一种双工通信)接收这些对象的使用者,因此我希望此字典在两侧都是只读的,以防止对其进行任何更改