ICE参数传递分析

来源:百度文库 编辑:神马文学网 时间:2024/04/24 21:24:57

ICE参数传递分析

       ICE由于涉及到不同进程甚至不同主机间的调用,所以需要对参数做些处理,下面以ICE自带的例子printer,并为他加入几个类型和函数进行分析。

 

       ICE为每个内置类型在IceInternal::BasicStream中写了readwrite函数,为stringvectorvector也写了readwrite函数。如果参数类型为以上类型那么就直接使用。如果参数类型为复杂的STL类型,如vector< vector >ICE在编译ice接口文件时会为该类型生成一对__read__write函数。如果内部使用了结构体,那么编译ice接口文件时会为该结构体生成一对__read__write函数,这两个函数将内部成员分别调用IceInternal::BasicStream中的readwrite函数。

 

       参数类型分三种,输入、输出和返回,但是返回和输出基本一样。

输入参数

结构体

       简单结构体为只有内置类型的机构体。ICE通过ice接口文件为结构体添加两个函数__read__write,读和写都通过这两个函数进行。这两个函数在调用IceInternal::BasicStream里每个基本类型的readwrite函数写到缓冲中。

 

string型输入参数

       下面以printString为例说明

l         客户端调用printString

l         调用IceProxy空间的printString函数

l         调用IceProxy空间的带Ice::ContextprintString函数

l         调用IceDelegateM空间的printString函数

l         调用IceInternal::BasicStream::write(string&),该函数会先写大小到缓冲区,然后将所有数据拷贝到缓冲区中,并改变缓冲区的位置。

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间的__printString函数

l         调用IceInternal::BasicStream::read,该函数会先读取大小,然后通过一个临时的string对象交换到string

 

vector型输入参数

下面以printArray为例说明

l         客户端调用printArray

l         调用IceProxy空间的printArray函数

l         调用IceProxy空间的带Ice::ContextprintArray函数

l         调用IceDelegateM空间的printArray函数

l         调用IceInternal::BasicStream::write(vector &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间的__printArray函数

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

vector< vector >型输入参数

下面以printArray为例说明

l         客户端调用printArray

l         调用IceProxy空间的printArray函数

l         调用IceProxy空间的带Ice::ContextprintArray函数

l         调用IceDelegateM空间的printArray函数

l         调用由ice接口文件生成的__write函数,先写vector的个数,然后依次调用IceInternal::BasicStream::write(vector &)函数

l         调用IceInternal::BasicStream::write(vector &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间的__printArray函数

l         调用由ice接口文件生成的__write函数,先读vector的个数,然后依次调用IceInternal::BasicStream::read(vector &)函数

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

输出参数

string型输出参数

       getString为例说明

l         调用IceProxy空间的getString函数

l         调用IceProxy空间的带Ice::ContextgetString函数

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间___getString

l         实际调用具体的getString函数

l         调用IceInternal::BasicStream::write(string&),该函数会先写大小到缓冲区,然后将所有数据拷贝到缓冲区中,并改变缓冲区的位置。

 

l         返回到客户端

l         调用IceInternal::BasicStream::read,该函数会先读取大小,然后通过一个临时的string对象交换到string

 

vector型输出参数

       getArray为例说明

l         调用IceProxy空间的getArray函数

l         调用IceProxy空间的带Ice::ContextgetArray函数

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间___getArray

l         实际调用具体的getArray函数

l         调用IceInternal::BasicStream::write(vector &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

l         返回到客户端

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

 

vector< vector >型输出参数

       getTable为例说明

l         调用IceProxy空间的getTable函数

l         调用IceProxy空间的带Ice::ContextgetTable函数

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间___getTable

l         实际调用具体的getTable函数

l         调用由ice接口文件生成的__write函数,先写vector的个数,然后依次调用IceInternal::BasicStream::write(vector &)函数

l         调用IceInternal::BasicStream::write(vector &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

l         返回到客户端

l         调用由ice接口文件生成的__write函数,先读vector的个数,然后依次调用IceInternal::BasicStream::read(vector &)函数

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。