使用WebService中对象反序列化的问题

fly4free 2011-04-13 04:13:27
这个是c#,.net基本的问题,但是问题来自使用WebService的过程。。。

我有一个 Web Service方法:

public string SaveJinChengJiLu(ProcessInfoRecord[] pirArray);


WebService document内容提到 SOAP 1.1 请求时,发送格式如下:

POST /ChkService/Receiver.asmx HTTP/1.1
Host: 192.168.0.222
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.tempurl.com/SaveJinChengJiLu"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthHeaderCS xmlns="http://www.tempurl.com/">
<UserID>string</UserID>
<Password>string</Password>
</AuthHeaderCS>
</soap:Header>
<soap:Body>
<SaveJinChengJiLu xmlns="http://www.tempurl.com/">
<pirArray>
<ProcessInfoRecord>
<RecordID>int</RecordID>
<TaskWorkingID>string</TaskWorkingID>
<ProcessName>string</ProcessName>
<ProcessAddress>long</ProcessAddress>
<ProcessID>int</ProcessID>
<IsHidden>int</IsHidden>
<Signature>int</Signature>
<ProcessPath>string</ProcessPath>
</ProcessInfoRecord>
<ProcessInfoRecord>
<RecordID>int</RecordID>
<TaskWorkingID>string</TaskWorkingID>
<ProcessName>string</ProcessName>
<ProcessAddress>long</ProcessAddress>
<ProcessID>int</ProcessID>
<IsHidden>int</IsHidden>
<Signature>int</Signature>
<ProcessPath>string</ProcessPath>
</ProcessInfoRecord>
</pirArray>
</SaveJinChengJiLu>
</soap:Body>
</soap:Envelope>


重点是 pirArray 节的内容

.Net框架通过一个我不知道的方法 把 上述数据构造了一个 ProcessInfoRecord 数组类型的 对象 pirArray

我的客户端程序是用 sproxy.exe 生成的 .h文件
这里产生的问题是,增加一个类别就增加一个webservice方法,管理起来很累人。
因为该工具有个bug,不知道什么样的方法名字符序列会导致sproxy.exe生成不了正确的 .h

所以我想,只用一个下面的接口
public string SaveData(int type, string xmlStr);

xmlStr为客户端拼接的串,这个应该是 ProcessInfoRecord [] 类型对象的序列化内容,然后通过一个我现在想要询问的一个方法给反序列化,最终生成对象 ProcessInfoRecord []pirArray;
请问有没有方法可以直接利用pirArray 的结构?如何反序列化?
这个不行的话,有其他方法吗?谢谢
...全文
373 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器人 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fly4free 的回复:]
引用 2 楼 fangxinggood 的回复:
你可以用C#作个WebService客户端,然后用COM包装,让C,C++用。


这个我现在再试

不过 用COM封装与 对象序列化、反序列化没什么关系吧?

不过我发现了一个 XmlSerializer 可以了。多谢关注。
[/Quote]
如果你用C#封装client端然后给C,C++用,就可以直接添加WebService引用。而不用自己序列化了。
fly4free 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fangxinggood 的回复:]
你可以用C#作个WebService客户端,然后用COM包装,让C,C++用。
[/Quote]

这个我现在再试

不过 用COM封装与 对象序列化、反序列化没什么关系吧?



不过我发现了一个 XmlSerializer 可以了。多谢关注。
fly4free 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 isjoe 的回复:]

你可以采用这样通用的方式public string SaveData(int type, DataSet xmlStr);
DataSet是微软WS通用的格式,你可以把数据保存在DataSet中,在服务器端自己解析

[/Quote]

我使用sproxy.exe 不支持复杂数据类型,数值类型,string, byte[] 可以
机器人 2011-04-13
  • 打赏
  • 举报
回复
你可以用C#作个WebService客户端,然后用COM包装,让C,C++用。
isjoe 2011-04-13
  • 打赏
  • 举报
回复
这个问题我也遇见过,的确是,每添加一个类别WS就会多出一个对应的代理类,你还得为新类别写新的方法

而且序列化是需要类别,如果你传递通用XML string,到了服务器端没有对应的类别无法序列化。

你可以采用这样通用的方式public string SaveData(int type, DataSet xmlStr);
DataSet是微软WS通用的格式,你可以把数据保存在DataSet中,在服务器端自己解析

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧