webservice 傳遞自定義類

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();
}

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章