`
zhaoningbo
  • 浏览: 609591 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

zeroc Ice方法参数均为“值传递”

阅读更多
引言:

    在使用Zeroc Ice做java侧开发的时候,会看到大量传引用的实例,但Ice并不支持这种“既in又out”的参数传法(跟网络传输特点有关)。

    具体说法请参看官方文档:
    http://www.zeroc.com/doc/Ice-3.3.0/manual/Slice.5.10.html(->4.10.1 Parameters and Return Values)

正文:

一、假设:

    1,有这个消息对象(用来传递):
//Snp_A, code snippet A
public class Message {

    private static final long serialVersionUID = 7186346309330010649L;

    public String id;
    public String content;
}

    2,有这个操作接口(用来整理消息。比如滤掉消息中的敏感字符):
//Snp_B, code snippet B
public interface MessageManager {

    public void trimMessage(Message msg);

    public Message getTrimedMessage(Message msg);
}


二、分析

    Snp_B片断中的两个方法的参数均为引用传递。其中trimMessage(msg)是将msg直接就地整理,而getTrimedMessage(msg)是将传入的msg整理完后以返回值传出——两者都存在参数“in & out”。非常常见。(读过《代码整洁之道》的朋友别忙喷我,第一个方法只是演示这么有这么个情况)

    两个都可以实现效果,但加入ICE以后,如果做为Servent发布,第一种就不成了。原因是:
引用

**TIP:
***from   :http://www.zeroc.com/doc/Ice-3.3.0/manual/Slice.5.10.html
***to view:4.10.1 Parameters and Return Values

...
By default, parameters are sent from the client to the server, that is, they are input parameters. To pass a value from the server to the client, you can use an output parameter, indicated by the out keyword.
...

    直接给trimMessage(msg)判了“死刑”!

三、结论

    鉴于以上情况,遇到这样的方法,可考虑以下三种方式来解决(按建议的优先级排列):

    1,将void trimMessage(msg)改型为 Message getTrimedMessage(msg);

    2,额外定义接收参数。例如:void trimMessage(msg, returnedMsg)。returnedMsg设定为“out”参数。Slice定义如下:
void trimMessage(Message msg, out Message returnedMsg);

    其中returnedMsg将被包装为*Holder类型通过(Message)(returnedMsg.value)拿到整理后的msg。另外msg参数前加上in与不加一样,因为默认为in。

    3,如果Message较复杂,可能考虑再包装一层使用setter/getter方式实现传入传出。




   
   
1
3
分享到:
评论

相关推荐

    zero ICE快速入门java版

    zero ICE快速入门文档, ice是最优秀的rpc框架。 4、开发服务端代码如下 步骤一:编写Servant类即带有Disp的存根文件也就是说继承_HelloWorldDisp 这个类,这个类是个抽象类定义如下: public abstract class _...

    Zero Ice中文教程

    Zero Ice中文教程里面详细介绍了Ice的分布式设计,中文版本。

    Zero ICE 3.5.1 jar

    远程调用框架 Zero ICE 3.5.1 jar

    Ice zero分布式程序设计2分

    Ice zero分布式程序设计Ice zero分布式程序设计Ice zero分布式程序设计Ice zero分布式程序设计Ice zero分布式程序设计

    Zero Ice 3.6源码

    ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,源码供大家研究使用。

    ice_3.7.0_linux版

    Zero ICE,Zeroc ICE,ice,linux,2017年最新版的Zero ICE版本3.7.0,linux版本 Zero ICE,Zeroc ICE,ice,linux,2017年最新版的Zero ICE版本3.7.0,linux版本

    Ice 3.4.1 在ARM上移植, 源代码补丁

    ICE 3.4.1 在移植到ARM Linux中时,double型的数据会有错误。见我在ZeroC发的帖子: http://www.zeroc.com/forums/bug-reports/5308-double-data-format-arm-linux-not-correct.html 在移植前,需要对源代码进行一些...

    zeroc ice教程 ice环境配置 Ice中文教程 C++ ICE java ICE ICE入门 ice基础教程 ice开发文档

    教程包括: 第一部分 Ice综述 第二部分 核心概念 第三部分 高级Ice 第四部分 Ice服务 附录ice各种配置说明

    Ice 分布式程序设计 中文PDF版_C++_Zero_

    ICE开发资料,帮助程序使用ZERO-ICE进行C++开发

    ICE客户端与服务端通信Demo

    平台编译环境:VS2017 ICE版本:3.7.7 ICEbuilder:5.0.9 源码中有两套程序: Server:启动服务器,等待连接 。连接后可双方通信 Client:连接服务器,与服务器通讯。 Slice: 手写几个接口即可。

    ZeroC ICE 简单介绍及代码

    介绍ICE互联网通讯引擎是什么,以及其工作原理。附有简单的源代码,可以实现测试使用。

    ICE 3.6.1 异步调用 VS2013 Demo

    ICE 异步调用 按照网上已有的例子,客户端调用需要加入["ami"]元数据指定,但ICE 3.4以后的版本不支持,所以对于ICE...本资源的ICE的版本为3.6.1,所以需要提前下载好ICE3.6.1,并在工程中设置头文件的路径和库的路径。

    基于ICE中间件实现的传文件

    基于ICE中间件实现的传文件 InstallService UpdateService dllICE

    zeroc ice u3d 网络组件

    zeroc_ice u3d tcp socket c# www.zeroc.com ice的unity3d版本。 独家发布。外边绝对没有。 需要咨询。可以给我发信息。

    Ice-3.6.4.msi

    Ice-3.6.4-msvc2015.msi zero-ice msvs2015 Ice-3.6.4-msvc2015.msi zero-ice msvs2015

    基于ice可靠消息传输框架

    基于ICE的可靠的、顺序的消息传输框架,发送消息时,先将消息持久到本地,等消息成功发送到目标机器后,删除本地消息。开发此框架的目的是为了公司业务数据的同步。消息节点有id和group,支持id、group以及其他任意...

    Pytorch实现将模型的所有参数的梯度清0

    有两种方式直接把模型的参数梯度设成0: model.zero_grad() optimizer.zero_grad()#当optimizer=optim.Optimizer(model.parameters())时,两者等效 如果想要把某一Variable的梯度置为0,只需用以下语句: ...

    zero w使用方法

    raspberry_pi zero w使用指南。喜欢这者自取。。。。。。。。。。。。。。。。。。。。。。。

    zeroc_ice-3.7.6 for python Windows32

    python安装ice: pip install zeroc-ice

    ice-3.7.3.tar.gz

    Ice源码~~Ice源码~~Ice源码~~Ice源码~~Ice源码~~Ice源码~~Ice源码~~Ice源码~~

Global site tag (gtag.js) - Google Analytics