webservice傳遞的內容必須是可序列化的,不管是參數還是返回值。webservice傳遞的自定義實體類必須在聲明的類前面標示[Serializable],指明可序列化的。當涉及到傳遞實體類集合的時候,如果運用IList<Student>來表示會報錯,原由是IList是不可以序列化的,這種情況下,我們可以運用 System.Collections.ObjectModel.Collection<Model>來表示一個實體類集合。以下爲webservice傳遞實體類和實體類集合實例:
using System.Collections.ObjectModel;
1.把實體類集合作爲Object[]傳遞
這種情況下,我們必須運用webservice中的實體類,傳遞的是實體類集合對應的Object[]傳遞,WebService中要領的參數類型是ArrayList。
WebService中的代碼:
[XmlInclude(typeof(Model))] //表現層須引用WebService中實體類
[WebMethod]
public string HelloModel(ArrayList modelList)
{
BLL.Class1 cls = new BLL.Class1();
return cls.GetName(modelList);
}
//必須運用 webservice中的實體類,傳遞實體類集合,作爲Object[]傳遞,WebService中的參數類型是ArrayList,並提供一個將集合轉化爲Object[]的公共類
表現層中的代碼:
private void button1_Click(object sender, EventArgs e)
{
string msg=String.empty;
Model.Class1 cm1= new Model.Class1();
cm1.Name="zhang";
Model.Class1 cm2 =new Model.Class1();
cm2.Name="wang";
IList<Model.Class1> modelList=new IList<Model.Class1>();
modelList.Add(cm1);
modelList.Add(cm2);
object[] array=ConvertToArray<Model.Class1>(modelList); //將集合轉換爲Objec[]的泛型方法
msg=service.HelloModel(array);
MessageBox.Show(msg);
//將集合轉換爲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(Model))]
[WebMethod]
public string HelloModel(Model modelInfo)
{
return modelInfo.Name;
}
然後表現層調用代碼是:
private void button2_Click(object sender, EventArgs e)
{
string str = string.empty;
Model.Class1 cm1 = new Model.Class1();這裏調用了webservice中的實體類,而不是Model中的實體類。否則出錯。
cm1.Name="123";
str=service.HelloModel(cm1);//傳遞webservice中的實體類
MessageBox.Show(str);
}
3、傳遞實體類構成的Collection。這是和情況1類似的情形,只是傳遞的類型不一樣。可以對照一下。
這種情況下,必須通過修改Reference.cs的代碼,不過每次更新都要重新修改,而且必須每個類修改,比較麻煩!不推選運用,這不知道是哪位仁兄想出來的要領,我也是看了人家的做法才總結出來的,不過能去修改Reference.cs的代碼,已經說明鑽研精神了,鼓勵下。
同樣先給出webservice中的代碼:
[webMethod]
public string HelloModelByList(Collection<Model> modelList)
{
BLL.Class1 cls =new BLL.Class1();
return cls.GetName(modelList);
}
表示層調用代碼:
傳遞實體類構成的Collection,通過修改Reference.cs的代碼,不過每次更新WebService之後都要重新修改,而且必須每個類修改。
private void button3_Click(object sender, EventArgs e)
{
string str = string.empty;
Model.Class1 cm1 = new Model.Class1();
cm1.Name = "lxinxuan";
Model.Class1 cm2 = new Model.Class1();
cm2.Name= "www.cnblogs.com/lxinxuan";
Collection<Model.Class1> modelList = new Collection<Model.Class1>();
modelList.Add(cm1);
modelList.Add(cm2);
str = service.HelloModelByList(modelList);
MessageBox.Show(str);
}
4、先將實體類集合序列化爲表現爲xml格式的string,然後在WebService中反序列化成Collection<>,然後再傳遞給業務層對象。
[WebMethod]
public string HelloModelByCollection(string sXml)
{
BLL.Class1 cls = new BLL.Class1();
Collection<Model> modelList = cls.DeSerializerCollection<Model>(sXml, typeof(Collection<Model>));//先反序列化爲Collection
return cls.GetName(modelList);
}
DeserializerCollection要領代碼如下:
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;
}
表現層調用代碼如下:
//先將實體類集合序列化爲string,然後在webservice中反序列化成Collection<>,然後再傳遞給業務層對象
private void button4_Click(object sender, EventArgs e)
{
string str = "";
Model.Class1 cm1=new Model.Class1();
cm1.Name="xinxuan";
Model.Class2 cm2=new Model.Class2();
cm2.Name="xinxuan";
Collection<Model.Class1> modelList=new Collection<Model.Class1>();
modelList.Add(cm1);
modelList.Add(cm2);
string modelString = this.Serializer<Collection<Model.Class1>>(modelList);//先序列化爲xml文件格式的string
str = service.HelloModelByCollection(modelString);
MessageBox.Show(str);
}
Serialize要領代碼如下:
// 實體類集合序列化爲字符串
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();
}