【IT168 技术】为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;按值将对象从一个应用程序域发送至另一个应用程序域。例如,序列化可用于在 ASP.NET 中保存会话状态,以及将对象复制到 Windows 窗体的剪贴板中。它还可用于按值将对象从一个应用程序域远程传递至另一个应用程序域。本文简要介绍了.NET对象序列化:TimeSpan 。
在WebServices中,TimeSpan不能作为系统的TimeSpan作为参数,在客户端会生成新的TimeSpan类。
一、问题重现
创建一个以TimeSpan为参数的Web Method:
1: [WebMethod]
2: public string HelloWorld(TimeSpan span)
3: {
4: return "Hello World";
5: }
6:
2: public string HelloWorld(TimeSpan span)
3: {
4: return "Hello World";
5: }
6:
查看WSDL文件,可以看到以下的内容:
1: <s:element name="HelloWorld">
2: - <s:complexType>
3: - <s:sequence>
4: <s:element minOccurs="1" maxOccurs="1" name="span" type="tns:TimeSpan" />
5: </s:sequence>
6: </s:complexType>
7: </s:element>
8: <s:complexType name="TimeSpan" />
2: - <s:complexType>
3: - <s:sequence>
4: <s:element minOccurs="1" maxOccurs="1" name="span" type="tns:TimeSpan" />
5: </s:sequence>
6: </s:complexType>
7: </s:element>
8: <s:complexType name="TimeSpan" />
客户端引用Web Services会生成新的TimeSpan类:
1: public partial class TimeSpan : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
2:
3: [System.NonSerializedAttribute()]
4: private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
5:
6: [global::System.ComponentModel.BrowsableAttribute(false)]
7: public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
8: get {
9: return this.extensionDataField;
10: }
11: set {
12: this.extensionDataField = value;
13: }
14: }
15:
16: public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
17:
18: protected void RaisePropertyChanged(string propertyName) {
19: System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
20: if ((propertyChanged != null)) {
21: propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
22: }
23: }
24: }
2:
3: [System.NonSerializedAttribute()]
4: private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
5:
6: [global::System.ComponentModel.BrowsableAttribute(false)]
7: public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
8: get {
9: return this.extensionDataField;
10: }
11: set {
12: this.extensionDataField = value;
13: }
14: }
15:
16: public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
17:
18: protected void RaisePropertyChanged(string propertyName) {
19: System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
20: if ((propertyChanged != null)) {
21: propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
22: }
23: }
24: }