3

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

4

0 回答 0