日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebService中使用自定义类的解决方法(5种)

發布時間:2025/4/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebService中使用自定义类的解决方法(5种) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://www.cnblogs.com/lxinxuan/archive/2007/05/24/758317.html

? ? ? ?Demo下載:http://files.cnblogs.com/lxinxuan/wa.rar
?????? 最近一個項目要用到webservice調用業務層類,剛開始的時候遇到了一點小麻煩,經過這兩天的總結和實踐,終于總結出幾個比較常見的情況下的解決方法。
??????? 不知道大家是怎么解決,可能太簡單了,所以沒有覺得它是一個問題。反正我在博客園中沒有搜索到相關的帖子。
??????? 說實話,以前并沒有真正開發過涉及webservice的項目,頂多也就是看看msdn,寫點小程序,當時并沒有發現問題,因為傳遞的參數和返回值都是簡單數據類型,所以并沒有發現本文提及的問題——使用自定義類。
?????????所謂自定義類,不知道我有沒有表達清楚,這里指的就是petshop中的Model層實體類了。
???????? 比如以下代碼:

using?System;
using?System.Collections;
using?System.Collections.Generic;
using?System.Text;

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

????????public?Student()
????????{?}

????????public?string?StuName
????????{
????????????get?{?return?this.stuName;?}
????????????set?{?this.stuName?=?value;?}
????????}
????}
}


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

1、把實體類集合,作為Object[]傳遞。
??????這種情況下,我們必須使用webservice中的實體類,傳遞的是實體類集合對應的Object[]傳遞,WebService中方法的參數類型是ArrayList。
比如WebService中的方法是:

[XmlInclude(typeof(Student))]
????????[WebMethod]
????????public?string?HelloStus(ArrayList?stuList)
????????{
????????????BLL.Class1?cls?=?new?BLL.Class1();
????????????return?cls.GetName(stuList);
????????}

別漏了[XmlInclude(typeof(Student))]這一行,不然在表現層就引用不到WebService中的實體類了。
這個時候,在表現層添加web引用,表現層中的調用代碼如下:(參考Demo中的button1_Click()方法)

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

????????????localhost.Student?stuInfo1?=?new?localhost.Student();
????????????stuInfo1.StuName?=?"lxinxuan";
????????????localhost.Student?stuInfo2?=?new?localhost.Student();
????????????stuInfo2.StuName?=?"www.cnblogs.com/lxinxuan";

????????????IList<localhost.Student>?stuList?=?new?List<localhost.Student>();
????????????stuList.Add(stuInfo1);
????????????stuList.Add(stuInfo2);

????????????object[]?array?=?this.ConvertToArray<localhost.Student>(stuList);//這是一個將集合轉換為Objec[]的泛型方法
????????????str?=?ser.HelloStus(array);//傳遞Object[],返回值是StuName的值

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


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

[XmlInclude(typeof(Student))]
????????[WebMethod]
????????public?string?HelloStu(Student?stuInfo)
????????{
????????????return?stuInfo.StuName;
????????}

同樣必須添加這一行代碼[XmlInclude(typeof(Student))]。
然后調用代碼是:

?///?<summary>
????????///?傳遞單個實體類,使用WebService中的實體類
????????///?</summary>
????????///?<param?name="sender"></param>
????????///?<param?name="e"></param>
????????private?void?button2_Click(object?sender,?EventArgs?e)
????????{
????????????string?str?=?"";
????????????localhost.Student?stuInfo1?=?new?localhost.Student();//注意,這里調用了webservice中的實體類,而不是Model中的實體類。否則出錯。
????????????stuInfo1.StuName?=?"lxinxuan";
????????????str?=?ser.HelloStu(stuInfo1);//傳遞webservice中的實體類
????????????MessageBox.Show(str);
????????}


3、傳遞實體類構成的Collection。這是和情況1類似的情形,只是傳遞的類型不一樣。可以對照一下。
這種情況下,必須通過修改Reference.cs的代碼,不過每次更新都要重新修改,而且必須每個類修改,比較麻煩!不推薦使用,這不知道是哪位仁兄想出來的方法,我也是看了人家的做法才總結出來的,不過能去修改Reference.cs的代碼,已經說明鉆研精神了,鼓勵下。
同樣先給出webservice中方法的代碼:

[WebMethod]
????????public?string?HelloStusByList(Collection<Student>?stuList)//這里參數類型是Collection
????????{
????????????BLL.Class1?cls?=?new?BLL.Class1();
????????????return?cls.GetName(stuList);
????????}

方法的參數是Collection,在添加了webservice之后,Reference.cs中的對應方法的參數變成了student[],數組!!webservice和數組走得真近阿。。。這里將Reference.cs中的方法HelloStusByList的參數類型student[]改為Collection<localhost.Student>,如下所示。
表示層調用代碼:

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

????????????localhost.Student?stuInfo1?=?new?localhost.Student();
????????????stuInfo1.StuName?=?"lxinxuan";
????????????localhost.Student?stuInfo2?=?new?localhost.Student();
????????????stuInfo2.StuName?=?"www.cnblogs.com/lxinxuan";

????????????Collection<localhost.Student>?stuList?=?new?Collection<localhost.Student>();
????????????stuList.Add(stuInfo1);
????????????stuList.Add(stuInfo2);

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

????????????MessageBox.Show(str);
????????}


4、先將實體類集合序列化為表現為xml格式的string,然后在webservice中反序列化成Collection<>(注意:不可以是IList<>),然后再傳遞給業務層對象。
[2007-5-25修改:博友“代碼亂了”提出,可以采用二進制序列化。確實是的,這里的xml序列化和binary序列化都是可以的,只是我為了調試時跟蹤信息方便,才用了xml序列化。這里不再羅列出來。謝謝“代碼亂了”]

[WebMethod]
????????public?string?HelloStusByCollection(string?sXml)
????????{
????????????BLL.Class1?cls?=?new?BLL.Class1();
????????????Collection<Student>?stuList?=?cls.DeSerializerCollection<Student>(sXml,?typeof(Collection<Student>));//先反序列化為Collection
????????????return?cls.GetName(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?=?XmlReader.Create(new?StringReader(sXml));
????????????System.Xml.Serialization.XmlSerializer?serializer?=?new?System.Xml.Serialization.XmlSerializer(type);
???????????
????????????object?obj?=?serializer.Deserialize(reader);
????????????return?(Collection<T>)obj;
????????}


表現層調用代碼如下:

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

????????????Student?stuInfo1?=?new?Student();
????????????stuInfo1.StuName?=?"lxinxuan";
????????????Student?stuInfo2?=?new?Student();
????????????stuInfo2.StuName?=?"www.cnblogs.com/lxinxuan";

????????????Collection<Student>?stuList?=?new?Collection<Student>();
????????????stuList.Add(stuInfo1);
????????????stuList.Add(stuInfo2);

????????????string?stuString?=?this.Serializer<Collection<Student>>(stuList);//先序列化為xml文件格式的string
????????????str?=?ser.HelloStusByCollection(stuString);
????????????MessageBox.Show(str);
????????}

Serialize方法代碼如下:

///?<summary>
????????///?實體類集合序列化為字符串
????????///?</summary>
????????///?<typeparam?name="T"></typeparam>
????????///?<param?name="objToXml"></param>
????????///?<returns></returns>
????????public?string?Serializer<T>(T?objToXml)
????????{
????????????System.IO.StringWriter?writer?=?new?System.IO.StringWriter();
????????????System.Xml.Serialization.XmlSerializer?serializer?=?new?System.Xml.Serialization.XmlSerializer(objToXml.GetType());
????????????serializer.Serialize(writer,?objToXml);
????????????return?writer.GetStringBuilder().ToString();
????????}


5、這種情況就是情況4的特例,序列化一個實體類并傳遞,方法類似,就不寫出來,參見Demo代碼。

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

轉載于:https://www.cnblogs.com/sharpest/p/8365479.html

總結

以上是生活随笔為你收集整理的WebService中使用自定义类的解决方法(5种)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.四虎.com | 国产精品免费看 | 手机看片1024久久 | 亚洲成a人无码 | 岛国av动作片 | 欧美性猛交xxxx免费看 | 六月丁香啪啪 | 欧美午夜精品久久久 | 九九视频精品在线 | 欧美 亚洲 另类 激情 另类 | 欧美精品久久久久性色 | 中文不卡视频 | 亚洲熟妇一区二区三区 | 免费看av的网址 | 午夜av免费在线观看 | 国产精品熟女久久久久久 | 午夜成人亚洲理伦片在线观看 | 国产一区二区三区免费在线观看 | 污污的视频网站在线观看 | 日视频| 国产综合网站 | 激情五月亚洲 | 乱色熟女综合一区二区三区 | 91蜜桃婷婷狠狠久久综合9色 | 97在线视频人妻无码 | 久久久xxx| 亚洲激情在线 | 婷婷丁香花五月天 | 中文字幕理伦片免费看 | 国产精品无码久久久久成人app | 国产69精品麻豆 | 一起操在线 | 日韩三级黄色 | 99一区二区| 国产精品一区二区三区在线看 | 亚洲私人影院 | 麻豆av免费观看 | 亚洲色图欧美在线 | 99国产精品久久久 | 久久三级| 性欧美大战久久久久久久 | 午夜888| 日韩成人看片 | 一级特黄aa | 奇米影视四色7777 | 黄色片hd | 拔擦8x成人一区二区三区 | 国产av无码专区亚洲av | 97国产成人 | 玩偶游戏在线观看免费 | 欧美成年人视频在线观看 | 香蕉成视频人app下载安装 | 久久久久久久亚洲av无码 | 亚洲综合av一区二区三区 | 一区二区三区四区五区av | 欧美三级色图 | 日韩人妻一区 | 无套暴操 | www在线播放 | 韩国av电影在线观看 | 午夜久久网| 好吊妞这里有精品 | 亚洲乱码电影 | 亚洲天堂第一 | 亚洲毛片大全 | 五月天视频网站 | 麻豆国产精品 | 国产精品国产三级国产aⅴ中文 | 91操视频| 最新国产在线 | 男男车车的车车网站w98免费 | 800av在线视频 | 好看的毛片 | 亚洲天堂视频在线 | 特极毛片 | 国产精品5 | 波多野结衣一区二区三区高清av | 亚洲一区二区自拍 | 日韩免费av一区二区 | 久久九色 | 男人的天堂伊人 | 九色porny蝌蚪视频 | 国产精九九网站漫画 | 婷婷五月综合激情 | 久久久久久91香蕉国产 | 在线观看av不卡 | 操校花视频 | 亚洲男女视频 | 久久一二三四区 | 日韩欧美影院 | 国产三级在线免费观看 | 黄色免费网站 | 国产一区二区91 | 日韩久草| 久久久久噜噜噜亚洲熟女综合 | 欧美精品在线免费观看 | 好吊妞视频一区二区三区 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 天堂а√在线中文在线 |