我正在使用 gSOAP 2.8.8 开发 Web 服务。我想发送自定义数据类型的无限序列。我可以按照gSOAP 用户指南的第 11.11 节来实现这一点,如下所示:
class ns__InnerType {
std::string someStr;
int someInt;
};
class VectorOfInnerTypes {
ns__InnerType* __ptr;
int __size;
};
void ns__myMethod(VectorOfInnerTypes in, ns__EmptyResponse out);
这很好用。但是,由于我的程序是用 C++ 编写的,所以我想利用 STL 向量。从我读过的所有内容来看,gSOAP 似乎支持序列化向量。这是我认为应该有效的方法:
#import "stlvector.h"
class VectorOfInnerTypes {
std::vector<ns__InnerType> mylist;
};
soapcpp2 很乐意编译它,并且在调用存根的myMethod
. 但是,这是通过网络传输的内容:
<s:Envelope ...>
<s:Body s:EncodingStyle=...>
<q1:myMethod xmlns:q1="urn:ns"/>
</s:Body>
</s:Envelope>
将此与我使用__ptr
/时的网络流量进行比较__size
:
<SOAP-ENV:Envelope ...>
<SOAP-ENV:Body ...>
<ns:myMethod>
<mylist xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="ns:InnerType[3]">
<item>...</item>
<item>...</item>
<item>...</item>
</mylist>
</ns:myMethod>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
为了开始std::vector
工作,我尝试了以下各种组合:
std::vector<ns__InnerType> mylist;
std::vector<ns__InnerType*> mylist;
std::vector<ns__InnerType>* mylist;
std::vector<ns__InnerType*>* mylist;
有必要soap_new_std__vectorTemplate...
并且soap_new_ns__InnerType
在客户端上准备数据时,但没有任何改进。它拒绝正确序列化。
当它工作(__ptr
/ __size
)和它不工作(std::vector
)时,调用myMethod
返回代码 202 或 HTTP 接受。
我以及在 C++ 程序中使用 gSOAP 的每个人如何使用 STL 向量而不是原始__ptr
/__size
方式?任何帮助将非常感激。