gSOAP中的动态数组采用C ++方式,使用STL向量而不是__ptr / __ size?

时间:2012-09-21 21:49:22

标签: c++ stl gsoap

我正在使用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方式?任何帮助将不胜感激。

0 个答案:

没有答案