zoukankan      html  css  js  c++  java
  • 动态调用WebService复杂对象传递

    项目需要用到外部提供的WebService,由于WebService的地址不固定,因此,采用动态调用的方式。

    具体的调用方式,参考园子的文章:

       1 动态调用 WebService

       2 【转】动态调用WebService

    代码没有什么问题,功能也可以实现,但是在传递复杂对象的时候,问题出来了。动态代理会自动生成自己的对象,无法通过强制转换实现调用。

    解决办法:

        1 传递对象为简单类型(string)

           调用webservice方法成功之后,返回对象之前,对复杂对象进行xml序列化

           返回对象中包含List结构

       1:  [Serializable]
       2:      public class QuestionEditList : BaseModel
       3:      {
       4:          private List<QuestionEditModel> _questionEditList = new List<QuestionEditModel>();
       5:   
       6:          public List<QuestionEditModel> QuesEditList
       7:          {
       8:              get { return _questionEditList ; }
       9:              set { _questionEditList   = value; }
      10:          }
      11:          public QuestionEditList(List<QuestionEditModel> questionEditList)
      12:          { 
      13:             this._questionEditList= questionEditList;
      14:   
      15:          }
      16:          public override void FromXml(string xml)
      17:          {
      18:              QuestionEditList question = (QuestionEditList)base.DeserializeFromXml(xml, typeof(QuestionEditList));
      19:              this.QuesEditList = question.QuesEditList;
      20:          }
      21:   
      22:          public override string ToXml()
      23:          {
      24:              return base.SerializeToXml(this);
      25:          }
      26:      }
     序列化后的结果:
       <QuestionEditList>
               <QuesEditList>
                    <QuestionEditModel>
                       <MajorQuestionID>1</MajorQuestionID>
                       <MinorQuestionID>0</MinorQuestionID>
                    </QuestionEditModel>
                    <QuestionEditModel>
                        <MajorQuestionID>2</MajorQuestionID>
                        <MinorQuestionID>0</MinorQuestionID>
                    </QuestionEditModel>
                    <QuestionEditModel>
                        <MajorQuestionID>3</MajorQuestionID>
                        <MinorQuestionID>0</MinorQuestionID>
                    </QuestionEditModel>
               </QuesEditList>
       </QuestionEditList>

        2 调用方拿到返回值,在进行xml反序列化

       1:   QuestionEditList questionList = new QuestionEditList();
       2:   questionList.FromXml(obj.ToString());
    通过这样的方式传递,就可以获取到可以控制的对象。
     
    序列化,反序列化方法
       1 序列化
       1:    protected string SerializeToXml(object o)
       2:          {
       3:              XmlSerializer serializer = new XmlSerializer(o.GetType(), "");
       4:              MemoryStream w = new MemoryStream();
       5:              XmlTextWriter writer = new XmlTextWriter(w, Encoding.Default);
       6:              writer.Formatting = Formatting.None;
       7:              serializer.Serialize((XmlWriter)writer, o);
       8:              writer.Close();
       9:              return Encoding.Default.GetString(w.ToArray())
                       .Replace("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"", "")
                       .Replace("<?xml version=\"1.0\" encoding=\"gb2312\"?>", "");
      10:          }
       2 反序列化
       1:   protected object DeserializeFromXml(string s, Type t)
       2:          {
       3:              XmlSerializer serializer = new XmlSerializer(t);
       4:              object obj2 = null;
       5:              XmlTextReader xmlReader = new XmlTextReader(s, XmlNodeType.Element, null);
       6:              obj2 = serializer.Deserialize(xmlReader);
       7:              xmlReader.Close();
       8:              return obj2;
       9:          }

      希望可以给大家带来帮助,,如有问题,欢迎讨论!

       路曼曼其修远兮,吾将上下而求索
  • 相关阅读:
    [翻译]使用设计模式简化.NET中菜单和Form元素之间的关系
    [AWDwR4]13章出错 protect_against_forgery
    使用存储过程(22)
    建立数据库连接(19)
    对数据库添加数据(21)
    ADO.NET常用对象(18)
    数据展现Repeater控件(25)
    content控件(24)
    对数据库增加数据(21)
    行为存储过程(23)
  • 原文地址:https://www.cnblogs.com/Richet/p/2044143.html
Copyright © 2011-2022 走看看