gSoap的 Serializing与Deserializing

gSoap能根据WSDL中定义的类型,自动生成针对这些类型的序列化/序列解析的代码,不用手工做任何的操作, 这对用C写程序来说真是天大的福音了;如果愿意,甚至可以把它用这作为C的Xml生成器和解析器怎么完成需要保存的数据的XML文件操作.

 

序列化的基本步骤如下:

struct TestResult result; //Wsdl中定义的格式 struct soap soap; soap_init(&soap); soap.sendfd = file; soap_serialize_ns1__TestResult( &soap, &result ); //序列化结构 soap_begin_send( &soap ); //启动发送 soap_put_ns1__TestResult( &soap, &result, "[namespace-prefix:]element-name1", "[namespace-prefix:]type-name1" ); soap_end_send( &soap ); ... ... soap_destroy( &soap ); soap_end( &soap ); soap_done( &soap );

其中soap.sendfd :

       gSoap可以使用一个已经打开的文件,socket等进行数据的收发
       soap.sendfd,soap.recvfd分别指定收和发的文件句柄.要操作完成后gSoap不会去关闭它们.

 

soap_put_ns1__TestResult( &soap, $result, "ns:element-name", "ns:type-name" ):

            发送已经序列化的TestResult结构的实例result, 第3,4参数中的ns为名称空间名,在gSoap生成代码
            时生成的.nsmap中定义,多数为ns1;

           [ namespace-prefix:] type-name1[ namespace-prefix:] type-name2 ,声明在soap消息中的元素名,

             通常我使用我使用接口的名字和类型名.

 

如果要序列化是对象是指针,应使用:

      soap_serialize_PointerTons1_TestResult()

      soap_put_PointerTons1__TestResult()

 

 

序列解析的步骤如下:

struct ns1__TestResult result; struct soap soap; soap_init( &soap ); soap.recvfd = fd; soap_begin_recv( &soap ); if(!soap_get_ns1__TestResult( &soap, &result, "[namespace-prefix:]element-name1", "[namespace-prefix:]type-name1" ) ) soap_print_fault(&soap, stderr); else { ... ... //序列解析完成 } soap_end_recv(&soap); soap_destroy( &soap ); soap_end( &soap ); soap_done( &soap );

这里应该就比较容易理解了, 把上面的发的换成对应的收就行了. 如 soap_begin_recv()对应soap_begin_send(),

soap_get_ns1_TestResult()对应发送时的soap_put_ns1_TestResult();

 注意这里的"namespace-prefix:]element-name1" 和 "[namespace-prefix:]type-name1"一定要和发送方的一至.

 

PS: soap.sendfd/recvfd可以是任意的文件句柄哦, 如soap.recvfd = open( "file.xml" ,...);

 

你可能感兴趣的:(c,xml,struct,socket,File,SOAP)