加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

.NET对象序列化—TimeSpan

发布时间:2020-12-17 01:18:34 所属栏目:安全 来源:网络整理
导读:??? 在WebServices中,TimeSpan不能作为系统的TimeSpan作为参数,在客户端会生成新的TimeSpan类。 一、问题重现 ??? 创建一个以TimeSpan为参数的Web Method: 1: [ WebMethod ] 2: public string HelloWorld( TimeSpan span) 3: { 4: return "Hello World" ;

??? 在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,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: }

????? 方法只能使用上面生成的TimeSpan:

image

? 二、解决方法

????? 扩展TimeSpan:

   1: public class TimeSpanEx
   2: {
   3:     [XmlElement(ElementName = "TimeSpan")]
   4:     public string TimeSpanAsString
   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);
5:  ?

?

?????? 服务端获取的TimeSpan结果:???

image

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读