加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

解决WebService 中泛型接口不能序列化问题

发布时间:2020-12-16 23:27:16 所属栏目:安全 来源:网络整理
导读:本来要定义WebServices 方法返回一泛型接口集合IList,系统提示不能序列化泛型接口集合 ? ?1 ? ??[WebMethod] ?2 ? ???????? public ?IList Employee ?GetEmployeeList() ?3 ? ????????{ ?4 ? ????????????IFormatter?formatter? = ? new ?SoapFormatter();

本来要定义WebServices 方法返回一泛型接口集合IList,系统提示不能序列化泛型接口集合

?


?1???[WebMethod]
?2?????????public?IList<Employee>?GetEmployeeList()
?3?????????{
?4?????????????IFormatter?formatter?=?new?SoapFormatter();
?5?????????????MemoryStream?mStream?=?new?MemoryStream();
?6?
?7?????????????Employee?em1?=?new?Employee();
?8?????????????em1.EmployeeID?=?1;
?9?????????????em1.FirstName?=?"jack";
10?????????????em1.LastName?=?"josn";
11?????????????IList<Employee>?list?=?new?List<Employee>();
12?????????????list.Add(em1);
13?????????????list.Add(em2);
14?????????????return?list;
15?

参考了相关的资料,可以有两种解决办法,一:用List<>泛型集合替代IList<>泛型接口集合。

二.将List<>泛型集合序列化为二进制形式,进行传递。

?


?1??///?<summary>
?2?????????///?List泛型集合替代IList
?3?????????///?</summary>
?4?????????///?<returns></returns>
?5?????????[WebMethod]
?6?????????public?List<Employee>?GetEmployeeList()
?7?????????{
?8?????????????IFormatter?formatter?=?new?SoapFormatter();
?9?????????????MemoryStream?mStream?=?new?MemoryStream();
10?
11?????????????Employee?em1?=?new?Employee();
12?????????????em1.EmployeeID?=?1;
13?????????????em1.FirstName?=?"jack";
14?????????????em1.LastName?=?"josn";
15?????????????List<Employee>?list?=?new?List<Employee>();
16?????????????list.Add(em1);
17?????????????return?list;
18?????????}
19?
20?????????///?<summary>
21?????????///?以二进制形式进行传递,客户端需进行返序列化
22?????????///?</summary>
23?????????///?<returns></returns>
24?????????[WebMethod]
25?????????public?byte[]?GetEmployeeListByteArray()
26?????????{
27?????????????Employee?em1?=?new?Employee();
28?????????????em1.EmployeeID?=?1;
29?????????????em1.FirstName?=?"jack";
30?????????????em1.LastName?=?"josn";
31?????????????IList<Employee>?list?=?new?List<Employee>();
32?????????????list.Add(em1);
33?????????????IFormatter?formatter?=?new?BinaryFormatter();
34?????????????MemoryStream?mStream?=?new?MemoryStream();
35?????????????byte[]?bs;
36?????????????if?(list?!=?null)
37?????????????{
38?????????????????formatter.Serialize(mStream,list);
39?????????????????bs?=?mStream.ToArray();
40?????????????}
41?????????????else
42?????????????{
43?????????????????bs?=?new?byte[0];
44?????????????}
45?????????????return?bs;?
46?

?

客户端反序列化代码

?


?1?????protected?void??CallService()
?2?????{
?3?????????WebService?ws?=?new?WebService();
?4?????????byte[]?bs?=?ws.GetEmployeeListByteArray();
?5?????????IList<Employee>?list?=?null;
?6?????????try
?7?????????{
?8?????????????MemoryStream?ms?=?new?MemoryStream(bs);????//创建Memory流对象
?9?????????????BinaryFormatter?formatter?=?new?BinaryFormatter();
10?????????????list?=?(List<Employee>)formatter.Deserialize(ms);????//反序列化
11?????????}
12?????????catch?(Exception?ex)
13?????????{
14?????????????Response.Write("<script?language='javaScript'>alert('"+ex.Message+"');</script>");
15?????????}
16?

?

非泛型集合的IList接口进行传递时,只需在方法前标识[XmlInclude(typeof(类型)]即可。

?


?1??[WebMethod]
?2?????????[XmlInclude(typeof(Employee))]
?3?????????public?IList?GetArticleList()
?4?????????{
?5?????????????IList?result?=?new?ArrayList();
?6?????????????for?(int?i?=?0;?i?<?20;?i++)
?7?????????????{
?8?????????????????DateTime?time?=?DateTime.Now.AddDays(i);
?9?????????????????Employee?em?=?new?Employee();
10?????????????????em.LastName?=?"jack";
11?????????????????em.EmployeeID?=?11;
12?????????????????result.Add(em);
13?????????????}
14?????????????return?result;
15?????????}
16


转载地址:http://www.cnblogs.com/yinhaiming/articles/1379424.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读