使用gsoap发送qt对象
我想发送qlist、qstring、qimage或qbytearray之类的qt对象。。。有gsoap吗? 根据我对gsoap的了解,我们只能发送原语类型为char*或int…的数据。 例子: 在客户端中,我有一个这样的结构使用gsoap发送qt对象,qt,wrapper,gsoap,Qt,Wrapper,Gsoap,我想发送qlist、qstring、qimage或qbytearray之类的qt对象。。。有gsoap吗? 根据我对gsoap的了解,我们只能发送原语类型为char*或int…的数据。 例子: 在客户端中,我有一个这样的结构 Struct mystr { QString x; QImage y; QbyteArray z; ... } QList<mystr> mylist; Struct mystr { QString x; QImage y; QbyteArray z; .
Struct mystr
{
QString x;
QImage y;
QbyteArray z;
...
}
QList<mystr> mylist;
Struct mystr
{
QString x;
QImage y;
QbyteArray z;
...
}
QList-mylist;
我用100000个数据结构填充这个列表,我想把它发送到服务器。如何做到这一点?如果有帮助,最新版本的gsoap toolkit 2.8.34现在支持XML中QT基元类型和QT容器的序列化,只需付出最小的努力 QT类型通过名称绑定到XSD类型,基本上只是一个typedef。然后,使用与代码一起编译和链接的自定义序列化程序对这些类型进行序列化 也许用一个简单的例子更容易理解这一切 要将
QString
用作可序列化类型,只需将#import“custom/QString.h”
添加到具有soapcpp2数据绑定接口的头文件中。然后在该文件上运行soapcpp2,并使用stdsoap2.cpp
编译生成的soapC.cpp
。别忘了#包括“soapH.h”
(也包括soapStub.h
)
下面是soapcpp2的头文件示例,其中包含要在XML中序列化的类型,方法是将这些类型声明为数据绑定并导入所需的自定义QT类型:
////////////////////////////////////////////////////////////////////////////
//
// Import the QT types that we want to bind to XSD types xsd__Type
//
////////////////////////////////////////////////////////////////////////////
#import "custom/qstring.h" // typedef QString xsd__string
#import "custom/qbytearray_base64.h" // typedef QByteArray xsd__base64Binary
////////////////////////////////////////////////////////////////////////////
//
// Declare QT container template(s) we will use
//
////////////////////////////////////////////////////////////////////////////
template <class T> class QList;
////////////////////////////////////////////////////////////////////////////
//
// Define an XML namespace "ns" for our schema
//
////////////////////////////////////////////////////////////////////////////
//gsoap ns schema namespace: urn:MyTypes
////////////////////////////////////////////////////////////////////////////
//
// Define C++ types that use the xsd__Type QT types imported above
//
////////////////////////////////////////////////////////////////////////////
class ns:MyStruct
{
public:
xsd__string x; // a QString object
xsd__base64Binary y; // a QByteArray object
};
class ns:MyData
{
public:
QList<ns:MyStruct> z; // a QT list of MyStruct
};
您可以使用soapcpp2的选项-0
(破折号0)来删除SOAP内容
如果要在此架构中为MyData
定义根元素,请将以下内容添加到头文件,然后在此文件上重新运行soapcpp2:
typedef ns:MyData _ns__myRoot; // ns:myRoot is an XML element of type ns:MyData
XML序列化程序可以按如下方式使用:
#include "soapH.h" // this is generated by soapcpp2
#include "ns.nsmap" // this is generated by soapcpp2
...
soap *ctx = soap_new1(SOAP_XML_INDENT); // create a context
MyData data;
...
data.push_back(MyStruct()); // populate some data
ctx->os = &std::cout;
soap_write__ns__myRoot(ctx, &data); // serialize data in XML
...
ctx->is = &std::cin;
soap_read__ns__myRoot(ctx, &data); // parse data from XML
...
soap_destroy(ctx);
soap_end(ctx);
soap_free(ctx).
希望这有帮助。如果有帮助,最新版本的gsoap toolkit 2.8.34现在支持XML中QT基元类型和QT容器的序列化,只需很少的努力 QT类型通过名称绑定到XSD类型,基本上只是一个typedef。然后,使用与代码一起编译和链接的自定义序列化程序对这些类型进行序列化 也许用一个简单的例子更容易理解这一切 要将
QString
用作可序列化类型,只需将#import“custom/QString.h”
添加到具有soapcpp2数据绑定接口的头文件中。然后在该文件上运行soapcpp2,并使用stdsoap2.cpp
编译生成的soapC.cpp
。别忘了#包括“soapH.h”
(也包括soapStub.h
)
下面是soapcpp2的头文件示例,其中包含要在XML中序列化的类型,方法是将这些类型声明为数据绑定并导入所需的自定义QT类型:
////////////////////////////////////////////////////////////////////////////
//
// Import the QT types that we want to bind to XSD types xsd__Type
//
////////////////////////////////////////////////////////////////////////////
#import "custom/qstring.h" // typedef QString xsd__string
#import "custom/qbytearray_base64.h" // typedef QByteArray xsd__base64Binary
////////////////////////////////////////////////////////////////////////////
//
// Declare QT container template(s) we will use
//
////////////////////////////////////////////////////////////////////////////
template <class T> class QList;
////////////////////////////////////////////////////////////////////////////
//
// Define an XML namespace "ns" for our schema
//
////////////////////////////////////////////////////////////////////////////
//gsoap ns schema namespace: urn:MyTypes
////////////////////////////////////////////////////////////////////////////
//
// Define C++ types that use the xsd__Type QT types imported above
//
////////////////////////////////////////////////////////////////////////////
class ns:MyStruct
{
public:
xsd__string x; // a QString object
xsd__base64Binary y; // a QByteArray object
};
class ns:MyData
{
public:
QList<ns:MyStruct> z; // a QT list of MyStruct
};
您可以使用soapcpp2的选项-0
(破折号0)来删除SOAP内容
如果要在此架构中为MyData
定义根元素,请将以下内容添加到头文件,然后在此文件上重新运行soapcpp2:
typedef ns:MyData _ns__myRoot; // ns:myRoot is an XML element of type ns:MyData
XML序列化程序可以按如下方式使用:
#include "soapH.h" // this is generated by soapcpp2
#include "ns.nsmap" // this is generated by soapcpp2
...
soap *ctx = soap_new1(SOAP_XML_INDENT); // create a context
MyData data;
...
data.push_back(MyStruct()); // populate some data
ctx->os = &std::cout;
soap_write__ns__myRoot(ctx, &data); // serialize data in XML
...
ctx->is = &std::cin;
soap_read__ns__myRoot(ctx, &data); // parse data from XML
...
soap_destroy(ctx);
soap_end(ctx);
soap_free(ctx).
希望这有帮助。soapcpp2工具无法识别
QString
和其他QT类型。要在XML中直接序列化这些文件,需要定义自定义序列化程序。否则,我将使用标准C++类型序列化和转换为QT类型。也许您可以建议gsoap开发人员实现QT类型序列化程序?我现在需要它。在gsoap开发者实现这一点之前……soapcpp2工具不会识别QString
和其他QT类型。要在XML中直接序列化这些文件,需要定义自定义序列化程序。否则,我将使用标准C++类型序列化和转换为QT类型。也许您可以建议gsoap开发人员实现QT类型序列化程序?我现在需要它。在gsoap开发者实现之前…谢谢,这非常有用。谢谢,这非常有用。