.NET对象序列化:TimeSpan

  为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;按值将对象从一个应用程序域发送至另一个应用程序域。例如,序列化可用于在 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);

原文地址:https://www.cnblogs.com/haosola/p/2040041.html