.NET对象序列化:TimeSpan
2011-05-07 21:49
399 查看
为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;按值将对象从一个应用程序域发送至另一个应用程序域。例如,序列化可用于在 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:
查看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" />
客户端引用Web Services会生成新的TimeSpan类:
1: public partial class TimeSpan : object, www.yzjxsp.com 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)) { www.jokedu.com
21: propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
22: }
23: }
24: }
方法只能使用上面生成的TimeSpan:
二、解决方法
扩展TimeSpan:
1: public class TimeSpanEx
2: {
3: [XmlElement(ElementName = "TimeSpan")]
4: public string TimeSpanAsString jokedu.com
5: {
6: get { return TimeSpan != null ? TimeSpan.ToString() : null; }
7: set
8: {
9: TimeSpan span;
10: if (value != null && TimeSpan.TryParse(value, out span))
11: TimeSpan = span;
12: else
13: TimeSpan = new TimeSpan();
14: }
15: }
16: [XmlIgnore]
17: public TimeSpan TimeSpan { get; set; }
18: }
通过TimeSpan传递TimeSpan:
1: [WebMethod]
2: public string HelloWorld(TimeSpanEx span)
3: {
4: return "Hello World";
5: }
6:
客户端使用示例:
1: WebService1SoapClient client = new WebService1SoapClient();
2: TimeSpanEx span = new TimeSpanEx();
3: span.TimeSpan = new TimeSpan(1, 2, 3).ToString();
4: client.HelloWorld(span);
在WebServices中,TimeSpan不能作为系统的TimeSpan作为参数,在客户端会生成新的TimeSpan类。
一、问题重现
创建一个以TimeSpan为参数的Web Method:
1: [WebMethod]
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" />
客户端引用Web Services会生成新的TimeSpan类:
1: public partial class TimeSpan : object, www.yzjxsp.com 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)) { www.jokedu.com
21: propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
22: }
23: }
24: }
方法只能使用上面生成的TimeSpan:
二、解决方法
扩展TimeSpan:
1: public class TimeSpanEx
2: {
3: [XmlElement(ElementName = "TimeSpan")]
4: public string TimeSpanAsString jokedu.com
5: {
6: get { return TimeSpan != null ? TimeSpan.ToString() : null; }
7: set
8: {
9: TimeSpan span;
10: if (value != null && TimeSpan.TryParse(value, out span))
11: TimeSpan = span;
12: else
13: TimeSpan = new TimeSpan();
14: }
15: }
16: [XmlIgnore]
17: public TimeSpan TimeSpan { get; set; }
18: }
通过TimeSpan传递TimeSpan:
1: [WebMethod]
2: public string HelloWorld(TimeSpanEx span)
3: {
4: return "Hello World";
5: }
6:
客户端使用示例:
1: WebService1SoapClient client = new WebService1SoapClient();
2: TimeSpanEx span = new TimeSpanEx();
3: span.TimeSpan = new TimeSpan(1, 2, 3).ToString();
4: client.HelloWorld(span);
相关文章推荐
- .NET对象序列化—TimeSpan
- .NET对象序列化—TimeSpan
- .NET 中的对象序列化
- .NET 中的对象序列化
- .NET 中Newtonsoft的使用 自定义对象的序列化
- .NET 对象的序列化和反序列化
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计2
- .NET 中的对象序列化
- .net中对象序列化技术浅谈
- .NET JSON对象序列化和反序列化
- .NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式
- .net中对象序列化技术浅谈
- .NET 中的对象序列化
- .NET 中的对象序列化
- xml序列化及反序列化.net对象
- .NET对象的XML序列化和反序列化
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务1
- .NET 中的对象序列化
- .NET 中的对象序列化
- .net中对象序列化技术浅谈