问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

WebService中使用自定义类的解决方法

发布网友 发布时间:2023-07-27 12:57

我来回答

1个回答

热心网友 时间:2024-12-13 18:06

         所谓自定义类 不知道我有没有表达清楚 这里指的就是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是最传统最好的办法了 呵呵~ lishixin/Article/program/net/201311/13064
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
windows8怎么本地连接 windows8如何设置网络 诸葛亮故里诸葛亮故里纪念馆 临沂诸葛亮文化旅游节历届介绍 第四届诸葛亮文化旅游节纪念诞辰 ...请根据该表回答下面问题: (1)表中A、B、C分 ...请你分析样品A、B、C中代表血浆、原尿和尿液的样品分别是... c糖蛋白化验 江诗丹顿金属手表(江诗丹顿的手表女款) 定位最好的手表? 表带上的圈叫什么 宁波有几家lv C罗到什么时候可以选择退役? 宁波和义大道好吃的 从家天下生活广场坐几路公交车到合肥妇幼保健院 从合肥青史站坐哪路公交可以到政务区蓝天绿地国际大厦A座 从绿地世纪城到康居小区东怎么坐公交车,最快需要多久 宣武市场南门到绿地世纪城怎么走 到合肥政务区绿地蓝海大厦怎么走 从绿地大道到妇幼保健院多远 怎么样才可以让自己的上篮不被盖帽 有哪些投篮上篮时避免被封盖的技巧和经验 上篮怎么防止被盖帽 晚上做梦捏死一只貂有什么寓意 梦见雪貂被杀的预兆 梦见白貂咬我我又打死了它 梦见打死水貂 梦见把貂打死了 德甲和德国足球都渐入佳境了? 为什么我的鼠标老是自己在那边动,尤其是打开文件和Word文档时? 家里床可以东西方向摆放吗 c# webService 自定义soap头??急急急 北京可以下龙虾网捕鱼吗 北方夏季可以钓小龙虾嘛 吃出新高度下一句 西瓜吃法再出新高度,这样的你肯定没见过 媳妇蒸馒头,和面不用水,也不用牛奶,出锅比面包还软,自带甜味 如何在食堂吃出健康新高度? 一个人能够管理几亩大棚木耳种植 复刻为什么成语 一个人能种几亩叶子菜 一个农业技术员能管理几亩地的大棚,或者能管理多少大棚? 如果一个国家完全复刻另一个国家的治国方法。没有因地制宜。用四个字... 梦见同学因为我吃醋的预兆 我们通常用什么词来表示一些高仿 种蔬菜一个人可以打理多少亩 配音秀莫愁不白头老师是谁 刮痧排毒的原理是什么?排毒刮痧刮哪里? 排骨酱可以派什么用场 平泉属于哪个省哪个市 对方以办理证件为名骗取费用,知道对方地址身份证可以报警吗?