【问题标题】:How can I return a java.lang.Object value to client on CORBA in my case?在我的情况下,如何在 CORBA 上向客户端返回 java.lang.Object 值?
【发布时间】:2013-12-18 00:54:44
【问题描述】:

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

interface Transaction {
    ???????? addResource(in TransactionResource resource);
}; 

我希望当客户端为 Transaction 引用对象调用 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 corba idl orb jacorb


    【解决方案1】:

    我不认为你可以用正常的方式做到这一点。

    根据我的理解,CORBA 的想法是,它定义了它的内部消息表示,它是平台中立的(因此它的跨平台互操作性)。试想,如果它允许你给出一个任意的Java Object,如果接收方是C++,那它怎么能假设将它转换成C++表示呢?

    简而言之,您可以简单地使用您在 IDL 中定义的结构,如果您真的想返回任意对象,CORBA 可能不是您想要的。考虑诸如 RMI 之类的事情。

    如果您真的需要这样做,我相信您唯一能做的就是自己进行序列化/反序列化,并将“对象”作为八位字节序列或字符串返回。但是,您需要注意得到的对象接收器仍然是一个单独的对象实例(以及它周围的代理)。如果这些代理的工作需要服务器端的资源,那么我相信你需要重新考虑你的设计。我认为没有任何解决方案可以以这种方式神奇地将远程对象与服务器端对象链接起来。

    【讨论】:

    • 感谢 Adrian Shum,使用您的想法,该程序运行良好。序列化和反序列化是解决方案,通过向客户端发送代表我的 java.lang.Object 的八位字节序列。
    • 说实话,虽然它在这种情况下有点工作,但它是最尴尬的解决方案。我强烈建议您检查您的设计并避免以这种方式使用 CORBA。
    • 我意识到序列化丢失了我的分布式引用,这些引用存在于 MyInvocationHandler 类中。当客户端反序列化代理对象并尝试使用分布式引用时,它会抛出异常,因为它无法识别任何 Servant :S 如果你能建议我一些解决方案。
    • 这就是为什么我提到“如果这些代理的工作需要服务器端的资源”。你正在寻找的东西是行不通的。继续并重新考虑适合您正在使用的技术的设计。 CORBA(甚至 RMI 等)不会神奇地让您将任意对象传输到客户端并期望它会神奇地工作。
    【解决方案2】:

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

    【讨论】:

    • 当我使用 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。
    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 2015-10-18
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    相关资源
    最近更新 更多