我正在使用 gSOAP 2.8.8 开发 Web 服务。我想发送自定义数据类型的无界序列。我可以通过以下方式实现这个gSOAP 用户指南第 11.11 节 http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc11.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 很高兴编译它,并且我能够在调用存根时传递 C++ 向量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>
To get 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...
and soap_new_ns__InnerType
在客户端准备数据时,但没有任何改进。它拒绝正确序列化。
两者都在工作时(__ptr
/__size
)并且当它没有(std::vector
),调用myMethod
返回代码 202,或 HTTP 已接受。
我以及每个在 C++ 程序中使用 gSOAP 的人如何使用 STL 向量而不是原语__ptr
/__size
方式?任何帮助将非常感激。