引言:
在使用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方式实现传入传出。
分享到:
相关推荐
zero ICE快速入门文档, ice是最优秀的rpc框架。 4、开发服务端代码如下 步骤一:编写Servant类即带有Disp的存根文件也就是说继承_HelloWorldDisp 这个类,这个类是个抽象类定义如下: public abstract class _...
**零冰(Zero Ice)教程概述** Zero Ice是一款强大的分布式框架,它允许开发者构建高度可扩展的、跨语言的应用程序。这个"Zero Ice中文教程"是针对中国开发者设计的,旨在帮助他们理解和应用Ice框架,克服语言障碍,...
远程调用框架 Zero ICE 3.5.1 jar
"Zero Ice 3.6源码" 是ZEROC公司提供的一个开源通信协议软件的源代码版本,其核心组件称为ICE(Internet Communications Engine),意即互联网通信引擎。ICE作为一个面向对象的中间件,旨在简化分布式系统开发,提供...
总结来说,文档为开发者提供了一个全面的ICE学习指南,从ICE的基础知识到实际的编程应用,再到配置和性能优化,覆盖了ICE开发的各个方面。通过阅读这份文档,开发者能够掌握ICE的使用方法,并能在实际项目中有效应用...
Ice Zero是Objectice Software公司推出的轻量级、高性能的RPC(远程过程调用)框架,它为开发者提供了一种简单、高效的方式来构建分布式系统。该框架的核心特点是它的零配置特性,使得在部署和维护过程中减少了大量...
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版本
ZeroC ICE C#客户端 C++服务端 参数中包含有中文的string出错的解决方法 现象: 使用ICE做开发,C++的服务端,C#的客户端,如果返回的string参数中包含有中文,则C#客户端会抛异常。
1. **ICE Proxy**:客户端通过代理对象与服务端对象交互,代理对象负责将本地调用转换为网络消息。 2. **ICE Skeleton**:在服务端,骨架对象接收来自客户端的网络消息,并将其转换为对本地对象的调用。 3. **ICE ...
一种支持 C++ java语言的Client /server 服务方式中文文档。。
从根本上说,这意味着 Ice 为构建面 向对象的客户-服务器应用提供了工具、 API 和库支持。 Ice 应用适合在异 种环境中使用:客户和服务器可以用不同的编程语言编写,可以运行在不 同的操作系统和机器架构上,并且...
《Ice分布式程序设计》中文PDF版是一本专为C++开发者设计的指南,它详细介绍了如何使用ZERO-ICE框架进行分布式编程。ZERO-ICE是一个强大的、面向对象的、基于组件的中间件,它允许程序员在多种语言之间创建无缝的、...
Ice,全称为“Internet Communication Engine”,是一种高性能、跨平台的分布式对象中间件,它提供了强大的接口定义语言(IDL)来定义服务接口,并能够自动在多种编程语言之间生成绑定代码。 1. **Ice通信框架基础*...
ICE 3.4.1 在移植到ARM Linux中时,double型的数据会有错误。见我在ZeroC发的帖子: http://www.zeroc.com/forums/bug-reports/5308-double-data-format-arm-linux-not-correct.html 在移植前,需要对源代码进行一些...
在Ubuntu系统上安装Zeroc-ICE环境主要涉及以下知识点: 1. Ubuntu虚拟机的安装:用户需要在计算机上安装一个虚拟机软件,比如VirtualBox或者VMware,然后在虚拟机中安装Ubuntu操作系统。这一步骤是为了创建一个独立...
介绍ICE互联网通讯引擎是什么,以及其工作原理。附有简单的源代码,可以实现测试使用。
平台编译环境:VS2017 ICE版本:3.7.7 ICEbuilder:5.0.9 源码中有两套程序: Server:启动服务器,等待连接 。连接后可双方通信 Client:连接服务器,与服务器通讯。 Slice: 手写几个接口即可。
ICE 异步调用 按照网上已有的例子,客户端调用需要加入["ami"]元数据指定,但ICE 3.4以后的版本不支持,所以对于ICE...本资源的ICE的版本为3.6.1,所以需要提前下载好ICE3.6.1,并在工程中设置头文件的路径和库的路径。