ICE参数传递分析

来源:百度文库 编辑:神马文学网 时间:2024/06/13 01:12:32
ICE由于涉及到不同进程甚至不同主机间的调用,所以需要对参数做些处理,下面以ICE自带的例子printer,并为他加入几个类型和函数进行分析。
ICE为每个内置类型在IceInternal::BasicStream中写了read和write函数,为string、vector、vector也写了read和write函数。如果参数类型为以上类型那么就直接使用。如果参数类型为复杂的STL类型,如vector< vector >,ICE在编译ice接口文件时会为该类型生成一对__read和__write函数。如果内部使用了结构体,那么编译ice接口文件时会为该结构体生成一对__read和__write函数,这两个函数将内部成员分别调用IceInternal::BasicStream中的read和write函数。
参数类型分三种,输入、输出和返回,但是返回和输出基本一样。
输入参数
结构体
简单结构体为只有内置类型的机构体。ICE通过ice接口文件为结构体添加两个函数__read和__write,读和写都通过这两个函数进行。这两个函数在调用IceInternal::BasicStream里每个基本类型的read和write函数写到缓冲中。
string型输入参数
下面以printString为例说明
l         客户端调用printString
l         调用IceProxy空间的printString函数
l         调用IceProxy空间的带Ice::Context的printString函数
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::Context的printArray函数
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::Context的printArray函数
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::Context的getString函数
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::Context的getArray函数
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::Context的getTable函数
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 &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。