知识大全 WebService中使用自定义类的解决方法

Posted

篇首语:古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 WebService中使用自定义类的解决方法相关的知识,希望对你有一定的参考价值。

WebService中使用自定义类的解决方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

         所谓自定义类 不知道我有没有表达清楚 这里指的就是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>来表示一个实体类集合 这里给出了两种可能出现的实体类和实体类集合 以下就开始说明各种解决方法          把实体类集合 作为Object[]传递       这种情况下 我们必须使用webservice中的实体类 传递的是实体类集合对应的Object[]传递 WebService中方法的参数类型是ArrayList 比如WebService中的方法是 [XmlInclude(typeof(Student))]        [WebMethod]        public string HelloStus(ArrayList stuList)                    BLL Class  cls = new BLL Class ();            return cls GetName(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 = ;

  localhost Student stuInfo = new localhost Student();            stuInfo StuName = lxinxuan ;            localhost Student stuInfo = new localhost Student();            stuInfo StuName = /lxinxuan ;

  IList<localhost Student> stuList = new List<localhost Student>();            stuList Add(stuInfo );            stuList Add(stuInfo );

  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 = ;            foreach (T t in tList)                            array[i] = t;                i++;                        return array;       

   传递单个实体类 使用WebService中的实体类这种情况下 可以看作是情况 的特例——只有一个元素的数组 当然 这种情况下我们可以换一种做法——使用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 button _Click(object sender  EventArgs e)                    string str =  ;            localhost Student stuInfo  = new localhost Student();//注意 这里调用了webservice中的实体类 而不是Model中的实体类 否则出错             stuInfo StuName =  lxinxuan ;            str = ser HelloStu(stuInfo );//传递webservice中的实体类            MessageBox Show(str);                 传递实体类构成的Collection 这是和情况 类似的情形 只是传递的类型不一样 可以对照一下 这种情况下 必须通过修改Reference cs的代码 不过每次更新都要重新修改 而且必须每个类修改 比较麻烦!不推荐使用 这不知道是哪位仁兄想出来的方法 我也是看了人家的做法才总结出来的 不过能去修改Reference cs的代码 已经说明钻研精神了 鼓励下 同样先给出webservice中方法的代码 [WebMethod]        public string HelloStusByList(Collection<Student> stuList)//这里参数类型是Collection                    BLL Class  cls = new BLL Class ();            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 button _Click(object sender  EventArgs e)                    string str =  ;            localhost Student stuInfo  = new localhost Student();            stuInfo StuName =  lxinxuan ;            localhost Student stuInfo  = new localhost Student();            stuInfo StuName =  /lxinxuan ;            Collection<localhost Student> stuList = new Collection<localhost Student>();            stuList Add(stuInfo );            stuList Add(stuInfo );            str = ser HelloStusByList(stuList);//默认情况下 这里HelloStusByList方法的参数是Student[] 通过手动修改为Collection 就可以了            MessageBox Show(str);        

   先将实体类集合序列化为表现为xml格式的string 然后在webservice中反序列化成Collection<>(注意 不可以是IList<>) 然后再传递给业务层对象

[WebMethod]        public string HelloStusByCollection(string sXml)                    BLL Class  cls = new BLL Class ();            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 button _Click(object sender  EventArgs e)                    string str =  ;            Student stuInfo  = new Student();            stuInfo StuName =  lxinxuan ;            Student stuInfo  = new Student();            stuInfo StuName =  /lxinxuan ;            Collection<Student> stuList = new Collection<Student>();            stuList Add(stuInfo );            stuList Add(stuInfo );            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();                 这种情况就是情况 的特例 序列化一个实体类并传递 方法类似 就不写出来 参见Demo代码 大概就是这些了 当然传递DataSet是最传统最好的办法了 呵呵~ cha138/Article/program/net/201311/13064

相关参考

知识大全 javascript中自定义对象的属性方法分享

这篇文章介绍了在javascript中自定义对象的属性方法有需要的朋友可以参考一下   首先介绍下关联数组复制代码代码如下:<script>vartest=newObject()

知识大全 如何在Microsoft.NET中自定义配置文件

如何在Microsoft.NET中自定义配置文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 在DNN 4.X中自定义登录界面

在DNN4.X中自定义登录界面  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  有时候我们需要自定

知识大全 Oracle中自定义函数 无参数 输入参数 输出参数

Oracle中自定义函数无参数输入参数输出参数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lis

知识大全 ASP.NET中自定义DataGrid分页设置的实现

ASP.NET中自定义DataGrid分页设置的实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 hibernate中自定义主键生成器[2]

publicvoidconfigure(TypetypePropertiesparamsDialectd)throwsMappingExceptionStringtable=paramsgetProp

知识大全 hibernate中自定义主键生成器

  Hibernate(目前使用的版本是)中提供了多种生成主键的方式  然而当前的这么多种生成方式未必能满足我们的要求  比如increment可以在一个hibernate实例的应用上很方便的时候但是

知识大全 hibernate中自定义主键生成器[1]

  Hibernate(目前使用的版本是)中提供了多种生成主键的方式  然而当前的这么多种生成方式未必能满足我们的要求  比如increment可以在一个hibernate实例的应用上很方便的时候但是

知识大全 使用webservice解决多系统登陆问题

  微软NET战略的一个比较重要的部分就是webservice利用webservice我们可以创建真正有效的分布式应用程序  下面我们对webservice做一些说明  假设A是客户端B是webser

知识大全 PHP5 在调用 JAVA WebService 时遇到的各种问题解决方法

PHP5在调用JAVAWebService时遇到的各种问题解决方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一