web前端

位置:IT落伍者 >> web前端 >> 浏览文章

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


发布日期:2023年07月12日
 
WebService中使用自定义类的解决方法
所谓自定义类不知道我有没有表达清楚这里指的就是petshop中的Model层实体类了

比如以下代码

usingSystem;

usingSystemCollections;

usingSystemCollectionsGeneric;

usingSystemText;

namespaceModel

{

[Serializable]

publicclassStudent

{

privatestringstuName;

publicStudent()

{}

publicstringStuName

{

get{returnthisstuName;}

set{thisstuName=value;}

}

}

}

webservice传递的内容必须是可序列化的不管是参数还是返回值上面定义的实体类Student在类定义之前标示了[Serializable]指明可序列化的但当涉及到实体类集合的时候如果使用IList<Student>来表示就会抱错原因是IList是不可以序列化的这种情况下我们就可以使用SystemCollectionsObjectModelCollection<Student>来表示一个实体类集合这里给出了两种可能出现的实体类和实体类集合以下就开始说明各种解决方法

把实体类集合作为Object[]传递

这种情况下我们必须使用webservice中的实体类传递的是实体类集合对应的Object[]传递WebService中方法的参数类型是ArrayList

比如WebService中的方法是

[XmlInclude(typeof(Student))]

[WebMethod]

publicstringHelloStus(ArrayListstuList)

{

BLLClasscls=newBLLClass();

returnclsGetName(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 = ;

localhostStudent stuInfo = new localhostStudent();

stuInfoStuName = lxinxuan;

localhostStudent stuInfo = new localhostStudent();

stuInfoStuName = /lxinxuan;

IList<localhostStudent> stuList = new List<localhostStudent>();

stuListAdd(stuInfo);

stuListAdd(stuInfo);

object[] array = thisConvertToArray<localhostStudent>(stuList);//这是一个将集合转换为Objec[]的泛型方法

str = serHelloStus(array);//传递Object[]返回值是StuName的值

MessageBoxShow(str);

}

//这是一个将集合转换为Objec[]的泛型方法

private object[] ConvertToArray<T>(IList<T> tList)

{

object[] array = new object[tListCount];

int i = ;

foreach (T t in tList)

{

array[i] = t;

i++;

}

return array;

}

传递单个实体类使用WebService中的实体类

这种情况下可以看作是情况的特例——只有一个元素的数组

当然这种情况下我们可以换一种做法——使用WebService中的实体类

先看webservice中的代码

[XmlInclude(typeof(Student))]

[WebMethod]

publicstringHelloStu(StudentstuInfo)

{

returnstuInfoStuName;

} 同样必须添加这一行代码[XmlInclude(typeof(Student))]

然后调用代码是

/**////<summary>

///传递单个实体类使用WebService中的实体类

///</summary>

///<paramname=sender></param>

///<paramname=e></param>

privatevoidbutton_Click(objectsenderEventArgse)

{

stringstr=;

localhostStudentstuInfo=newlocalhostStudent();//注意这里调用了webservice中的实体类而不是Model中的实体类否则出错

stuInfoStuName=lxinxuan;

str=serHelloStu(stuInfo);//传递webservice中的实体类

MessageBoxShow(str);

}

传递实体类构成的Collection这是和情况类似的情形只是传递的类型不一样可以对照一下

这种情况下必须通过修改Referencecs的代码不过每次更新都要重新修改而且必须每个类修改比较麻烦!不推荐使用这不知道是哪位仁兄想出来的方法我也是看了人家的做法才总结出来的不过能去修改Referencecs的代码已经说明钻研精神了鼓励下

同样先给出webservice中方法的代码

[WebMethod]

publicstringHelloStusByList(Collection<Student>stuList)//这里参数类型是Collection

{

BLLClasscls=newBLLClass();

returnclsGetName(stuList);

} 方法的参数是Collection在添加了webservice之后Referencecs中的对应方法的参数变成了student[]数组!!webservice和数组走得真近阿这里将Referencecs中的方法HelloStusByList的参数类型student[]改为Collection<localhostStudent>如下所示

表示层调用代码

/**////<summary>

///传递实体类构成的Collection通过修改Referencecs的代码不过每次更新WebService之后都要重新修改而且必须每个类修改麻烦

///</summary>

///<paramname=sender></param>

///<paramname=e></param>

privatevoidbutton_Click(objectsenderEventArgse)

{

stringstr=;

localhostStudentstuInfo=newlocalhostStudent();

stuInfoStuName=lxinxuan;

localhostStudentstuInfo=newlocalhostStudent();

stuInfoStuName=/lxinxuan;

Collection<localhostStudent>stuList=newCollection<localhostStudent>();

stuListAdd(stuInfo);

stuListAdd(stuInfo);

str=serHelloStusByList(stuList);//默认情况下这里HelloStusByList方法的参数是Student[]通过手动修改为Collection就可以了

MessageBoxShow(str);

}

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

[WebMethod]

publicstringHelloStusByCollection(stringsXml)

{

BLLClasscls=newBLLClass();

Collection<Student>stuList=clsDeSerializerCollection<Student>(sXmltypeof(Collection<Student>));//先反序列化为Collection

returnclsGetName(stuList);

}DeserializerCollection方法代码如下

/**////<summary>

///

///</summary>

///<typeparamname=T></typeparam>

///<paramname=sXml></param>

///<paramname=type></param>

///<returns></returns>

publicCollection<T>DeSerializerCollection<T>(stringsXmlTypetype)

{

XmlReaderreader=XmlReaderCreate(newStringReader(sXml));

SystemXmlSerializationXmlSerializerserializer=newSystemXmlSerializationXmlSerializer(type);

objectobj=serializerDeserialize(reader);

return(Collection<T>)obj;

}

表现层调用代码如下

/**////<summary>

///先将实体类集合序列化为string然后在webservice中反序列化成Collection<>然后再传递给业务层对象

///</summary>

///<paramname=sender></param>

///<paramname=e></param>

privatevoidbutton_Click(objectsenderEventArgse)

{

stringstr=;

StudentstuInfo=newStudent();

stuInfoStuName=lxinxuan;

StudentstuInfo=newStudent();

stuInfoStuName=/lxinxuan;

Collection<Student>stuList=newCollection<Student>();

stuListAdd(stuInfo);

stuListAdd(stuInfo);

stringstuString=thisSerializer<Collection<Student>>(stuList);//先序列化为xml文件格式的string

str=serHelloStusByCollection(stuString);

MessageBoxShow(str);

}Serialize方法代码如下

/**////<summary>

///实体类集合序列化为字符串

///</summary>

///<typeparamname=T></typeparam>

///<paramname=objToXml></param>

///<returns></returns>

publicstringSerializer<T>(TobjToXml)

{

SystemIOStringWriterwriter=newSystemIOStringWriter();

SystemXmlSerializationXmlSerializerserializer=newSystemXmlSerializationXmlSerializer(objToXmlGetType());

serializerSerialize(writerobjToXml);

returnwriterGetStringBuilder()ToString();

}

这种情况就是情况的特例序列化一个实体类并传递方法类似就不写出来参见Demo代码

大概就是这些了当然传递DataSet是最传统最好的办法了呵呵~

               

上一篇:自定义创建web验证控件

下一篇:在数据架构规划前进行XML消息的设计