我正在使用gSOAP 2.8.8开发一个Web服务。我想发送一个自定义数据类型的无限序列。我可以按照section 11.11 of gSOAP's User Guide这样实现:
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
时传递一个C ++向量。但是,这是网络上的内容:
<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 Accepted。
我如何以及在C ++程序中使用gSOAP的每个人使用STL向量而不是原始__ptr
/ __size
方式?任何帮助将不胜感激。