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();
}
- webservice 传递自定义类
- android调用webservice传递自定义类以及类的集合
- KETTLE内WEBSERVICE实现对自定义类对象的传递
- 关于WebService传递自定义对象的问题
- java利用axis2调用.net写的webservice,传递自定义的实体类参数
- 使用WebService传递自定义对象需要注意的问题
- webservice如何传递复杂参数和自定义参数
- 用AMFPHP传递自定义类
- webservice 参数传递
- webservice+axis文件传递
- webservice+axis文件传递
- WebService如何传递HashTable
- webservice传递ResultSet结果
- WebService如何传递HashTable
- WebService传递大字符串
- webservice 传递特殊字符,
- WebService CXF学习(进阶篇1):自定义对象传递(简单JavaBean对象)
- Android 客户端调用基于XFire的webService方法传递自定义对象
- 字符数组初探
- WPF实现科拖拽分隔栏
- PreTranslateMessage作用和使用方法
- 别因为父母的反对而分手 - Qzone日志
- 正则表达式
- webservice 传递自定义类
- php 数组当中一些特殊使用
- OpenCV2.4 例程六 (人眼检测)
- com 与 dll 的区别
- Java 可变参数
- 千姿百态项目经理3——“牛X”项目经理2
- 在AWK中输出特殊字符-单引号
- opcv 直方图计算
- 高可用之2——存储b