在我的例子中,如何向CORBA上的客户机返回java.lang.Object值?

在我的例子中,如何向CORBA上的客户机返回java.lang.Object值?,java,corba,idl,orb,jacorb,Java,Corba,Idl,Orb,Jacorb,我正在开发一个Corba应用程序。 我的IDL界面如下所示: interface Transaction { ???????? addResource(in TransactionResource resource); }; 我希望当客户端为事务引用对象调用addResource方法时,该方法能够返回Proxy.newProxyInstance的返回值。。。。给客户 addResource实现的示例: public ?????? addResource(TransactionReso

我正在开发一个Corba应用程序。 我的IDL界面如下所示:

interface Transaction {
    ???????? addResource(in TransactionResource resource);
}; 
我希望当客户端为事务引用对象调用addResource方法时,该方法能够返回Proxy.newProxyInstance的返回值。。。。给客户

addResource实现的示例:

public ?????? addResource(TransactionResource resource) {
        // creation of a proxy. 
            java.lang.Object o = Proxy.newProxyInstance(ManageDemand.class.getClassLoader() , new Class[] {ManageDemand.class}, new MyInvocationHandler());

        return o;
    }
我想把o还给客户,我怎么做


addResource方法返回值的类型是什么?是org.omg.CORBA.Object吗?还是其他类型?

您应该返回java.lang.Object的类型,然后在客户端您应该将其强制转换回来。

我认为您不能用正常的方法执行此操作

根据我的理解,CORBA的思想是,它定义了它的内部消息表示,它是平台无关的,因此它具有跨平台的互操作性。试想一下,如果允许你给任意java对象,如果接收方是C++,那么它怎么能假设它转换成C++表示?< /p> 简而言之,您可以简单地使用IDL中定义的结构,如果您真的想返回任意对象,CORBA可能不是您想要的。考虑RMI等。
如果您真的需要这样做,我相信您唯一能做的就是自己进行序列化/反序列化,并将对象作为八位字节序列或字符串返回。但是,您需要知道,对象接收方仍然是对象的一个单独实例,因此它周围的代理也是如此。如果这些代理的工作需要服务器端的资源,那么我相信您需要重新考虑您的设计。我认为没有任何解决方案能够以这种方式将远程对象与服务器端对象神奇地连接起来。

当我使用org.omg.CORBA.object返回值时,我有这个错误:线程主org.omg.CORBA.UNKNOWN中的异常:服务器端异常:java.la ng.ClassCastException:com.sun.proxy.$Proxy0不能转换为org.omg.CORBA.por table.objectimpl,这说明我无法将java.lang.Object转换为org.omg.CORBA。Object@Ashish你的回答模棱两可。你是指java.lang.Object还是org.omg.CORBA.Object?很抱歉,我指的是java.lang.Object。你不能在IDL上定义java.lang.Object。谢谢Adrian Shum,使用你的想法,程序运行得很好。序列化和反序列化是解决方案,通过向客户机发送代表我的java.lang.Object的八位字节序列。老实说,虽然在这种情况下可以工作,但这是最尴尬的解决方案。我强烈建议您仔细研究您的设计,避免以这种方式使用CORBA。我意识到序列化会丢失MyInvocationHandler类中的分布式引用。当客户端反序列化代理对象并尝试使用分布式引用时,它会抛出异常,因为它无法识别任何服务:S(如果您可以建议我一些解决方案)。这就是为什么我提到这些代理的工作是否需要服务器端的资源。你要找的东西是行不通的。继续,重新思考您的设计,使之与您正在使用的技术相适应。CORBA甚至RMI等都不会神奇地让您将任意对象传输到客户端,并期望它能神奇地工作。