webservice 传递自定义类

来源:互联网 发布:club域名续费多少钱 编辑:程序博客网 时间:2024/05/01 08:52

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

 


 

原创粉丝点击