ICE参数传递分析

原创 2006年05月21日 16:52:00

ICE参数传递分析

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

 

       ICE为每个内置类型在IceInternal::BasicStream中写了readwrite函数,为stringvector<string>vector<T>也写了readwrite函数。如果参数类型为以上类型那么就直接使用。如果参数类型为复杂的STL类型,如vector< vector<string> >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<string>型输入参数

下面以printArray为例说明

l         客户端调用printArray

l         调用IceProxy空间的printArray函数

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

l         调用IceDelegateM空间的printArray函数

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数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<string> >型输入参数

下面以printArray为例说明

l         客户端调用printArray

l         调用IceProxy空间的printArray函数

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

l         调用IceDelegateM空间的printArray函数

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

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数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<string> &)函数

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<string>型输出参数

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

 

l         返回到客户端

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

 

 

vector< vector<string> >型输出参数

       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<string> &)函数

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

 

l         返回到客户端

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

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

 

 

 

相关文章推荐

ICE的属性配置

本文介绍了如何通过命令行参数或配置文件设置ICE的行为 在前一篇 文章中,大家可能都注意到了一个细节,Ice的初始化函数initialize 的输入参数正好是主函数的输入参数,也就是命令行参数(...

IceDelegateM 和IceDelegateD的区别和联系

IceDelegateM 和IceDelegateD的区别和联系

ICE简介及C++程序例子

一、ICE简介: 1、ICE是什么?  ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面...

ICE入门之hello world

本文主要讲解ICE入门第一个hello world程序编写,内容来源于ICE官方文档。

Silverlight参数传递

  • 2014年11月27日 14:31
  • 278B
  • 下载

C语言函数参数传递的分析

一、值传递和指针传递的概念 (一)值传递 值传递,即按值传递参数,按值传递参数时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的...
  • gatieme
  • gatieme
  • 2013年12月29日 20:16
  • 22000

java参数传递

  • 2014年07月07日 17:31
  • 390KB
  • 下载

u-boot与linux内核间的参数传递过程分析

http://www.nishizawa23.com/ http://liuyue18301.blog.163.com/blog/static/27913282009930112920220/?fr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ICE参数传递分析
举报原因:
原因补充:

(最多只允许输入30个字)