熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

WebService中使用自定義類的解決方法

2013-11-13 10:15:18  來源: .NET編程 
         所謂自定義類不知道我有沒有表達清楚這裡指的就是petshop中的Model層實體類了
         比如以下代碼

using System;
using SystemCollections;
using SystemCollectionsGeneric;
using SystemText;

namespace Model
{
    [Serializable]
    public class Student
    {
        private string stuName;

        public Student()
        { }

        public string StuName
        {
            get { return thisstuName; }
            set { thisstuName = value; }
        }
    }
}

         webservice傳遞的內容必須是可序列化的不管是參數還是返回值上面定義的實體類Student在類定義之前標示了[Serializable]指明可序列化的但當涉及到實體類集合的時候如果使用IList<Student>來表示就會抱錯原因是IList是不可以序列化的這種情況下我們就可以使用SystemCollectionsObjectModelCollection<Student>來表示一個實體類集合這裡給出了兩種可能出現的實體類和實體類集合以下就開始說明各種解決方法

         把實體類集合作為Object[]傳遞
      這種情況下我們必須使用webservice中的實體類傳遞的是實體類集合對應的Object[]傳遞WebService中方法的參數類型是ArrayList
比如WebService中的方法是
[XmlInclude(typeof(Student))]
        [WebMethod]
        public string HelloStus(ArrayList stuList)
        {
            BLLClass cls = new BLLClass();
            return clsGetName(stuList);
        }         別漏了[XmlInclude(typeof(Student))]這一行不然在表現層就引用不到WebService中的實體類了
這個時候在表現層添加web引用表現層中的調用代碼如下(參考Demo中的button_Click()方法)

  /// <summary>
        /// 必須使用webservice中的實體類傳遞實體類集合作為Object[]傳遞WebService中的參數類型是ArrayList並提供一個將集合轉化為Object[]的公共類
        /// </summary>
        /// <param name=sender></param>
        /// <param name=e></param>
        private void button_Click(object sender EventArgs e)
        {
            string str = ;

  localhostStudent stuInfo = new localhostStudent();
            stuInfoStuName = lxinxuan;
            localhostStudent stuInfo = new localhostStudent();
            stuInfoStuName = /lxinxuan;

  IList<localhostStudent> stuList = new List<localhostStudent>();
            stuListAdd(stuInfo);
            stuListAdd(stuInfo);

  object[] array = thisConvertToArray<localhostStudent>(stuList);//這是一個將集合轉換為Objec[]的泛型方法
            str = serHelloStus(array);//傳遞Object[]返回值是StuName的值

  MessageBoxShow(str);
        }
//這是一個將集合轉換為Objec[]的泛型方法
 private object[] ConvertToArray<T>(IList<T> tList)
        {
            object[] array = new object[tListCount];
            int i = ;
            foreach (T t in tList)
            {
                array[i] = t;
                i++;
            }
            return array;
        }

  傳遞單個實體類使用WebService中的實體類
這種情況下可以看作是情況的特例——只有一個元素的數組
當然這種情況下我們可以換一種做法——使用WebService中的實體類
先看webservice中的代碼


[XmlInclude(typeof(Student))]
        [WebMethod]
        public string HelloStu(Student stuInfo)
        {
            return stuInfoStuName;
        }         同樣必須添加這一行代碼[XmlInclude(typeof(Student))]
然後調用代碼是

 /**//// <summary>
        /// 傳遞單個實體類使用WebService中的實體類
        /// </summary>
        /// <param name=sender></param>
        /// <param name=e></param>
        private void button_Click(object sender EventArgs e)
        {
            string str = ;
            localhostStudent stuInfo = new localhostStudent();//注意這裡調用了webservice中的實體類而不是Model中的實體類否則出錯
            stuInfoStuName = lxinxuan;
            str = serHelloStu(stuInfo);//傳遞webservice中的實體類
            MessageBoxShow(str);
        }
         傳遞實體類構成的Collection這是和情況類似的情形只是傳遞的類型不一樣可以對照一下
這種情況下必須通過修改Referencecs的代碼不過每次更新都要重新修改而且必須每個類修改比較麻煩!不推薦使用這不知道是哪位仁兄想出來的方法我也是看了人家的做法才總結出來的不過能去修改Referencecs的代碼已經說明鑽研精神了鼓勵下
同樣先給出webservice中方法的代碼

[WebMethod]
        public string HelloStusByList(Collection<Student> stuList)//這裡參數類型是Collection
        {
            BLLClass cls = new BLLClass();
            return clsGetName(stuList);
        }         方法的參數是Collection在添加了webservice之後Referencecs中的對應方法的參數變成了student[]數組!!webservice和數組走得真近阿這裡將Referencecs中的方法HelloStusByList的參數類型student[]改為Collection<localhostStudent>如下所示
表示層調用代碼

/**//// <summary>
        /// 傳遞實體類構成的Collection通過修改Referencecs的代碼不過每次更新WebService之後都要重新修改而且必須每個類修改麻煩
        /// </summary>
        /// <param name=sender></param>
        /// <param name=e></param>
        private void button_Click(object sender EventArgs e)
        {
            string str = ;

            localhostStudent stuInfo = new localhostStudent();
            stuInfoStuName = lxinxuan;
            localhostStudent stuInfo = new localhostStudent();
            stuInfoStuName = /lxinxuan;

            Collection<localhostStudent> stuList = new Collection<localhostStudent>();
            stuListAdd(stuInfo);
            stuListAdd(stuInfo);

            str = serHelloStusByList(stuList);//默認情況下這裡HelloStusByList方法的參數是Student[]通過手動修改為Collection就可以了

            MessageBoxShow(str);
        }

  先將實體類集合序列化為表現為xml格式的string然後在webservice中反序列化成Collection<>(注意不可以是IList<>)然後再傳遞給業務層對象


[WebMethod]
        public string HelloStusByCollection(string sXml)
        {
            BLLClass cls = new BLLClass();
            Collection<Student> stuList = clsDeSerializerCollection<Student>(sXml typeof(Collection<Student>));//先反序列化為Collection
            return clsGetName(stuList);
        }DeserializerCollection方法代碼如下

        /**//// <summary>
        /// 
        /// </summary>
        /// <typeparam name=T></typeparam>
        /// <param name=sXml></param>
        /// <param name=type></param>
        /// <returns></returns>
        public Collection<T> DeSerializerCollection<T>(string sXml Type type)
        {
            XmlReader reader = XmlReaderCreate(new StringReader(sXml));
            SystemXmlSerializationXmlSerializer serializer = new SystemXmlSerializationXmlSerializer(type);
           
            object obj = serializerDeserialize(reader);
            return (Collection<T>)obj;
        }
表現層調用代碼如下

/**//// <summary>
        /// 先將實體類集合序列化為string然後在webservice中反序列化成Collection<>然後再傳遞給業務層對象
        /// </summary>
        /// <param name=sender></param>
        /// <param name=e></param>
        private void button_Click(object sender EventArgs e)
        {
            string str = ;

            Student stuInfo = new Student();
            stuInfoStuName = lxinxuan;
            Student stuInfo = new Student();
            stuInfoStuName = /lxinxuan;

            Collection<Student> stuList = new Collection<Student>();
            stuListAdd(stuInfo);
            stuListAdd(stuInfo);

            string stuString = thisSerializer<Collection<Student>>(stuList);//先序列化為xml文件格式的string
            str = serHelloStusByCollection(stuString);
            MessageBoxShow(str);
        }Serialize方法代碼如下

/**//// <summary>
        /// 實體類集合序列化為字符串
        /// </summary>
        /// <typeparam name=T></typeparam>
        /// <param name=objToXml></param>
        /// <returns></returns>
        public string Serializer<T>(T objToXml)
        {
            SystemIOStringWriter writer = new SystemIOStringWriter();
            SystemXmlSerializationXmlSerializer serializer = new SystemXmlSerializationXmlSerializer(objToXmlGetType());
            serializerSerialize(writer objToXml);
            return writerGetStringBuilder()ToString();
        }
         這種情況就是情況的特例序列化一個實體類並傳遞方法類似就不寫出來參見Demo代碼

大概就是這些了當然傳遞DataSet是最傳統最好的辦法了呵呵~


From:http://tw.wingwit.com/Article/program/net/201311/13064.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.