2013-12-18 8 views
0

Я разрабатываю приложение Corba. Мой IDL интерфейс выглядеть следующим образом:Как я могу вернуть значение java.lang.Object клиенту на CORBA в моем случае?

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

Я хотел бы, когда клиент вызова метода addResource для опорного Transaction объекта, который может быть в состоянии вернуть возвращаемое значение Proxy.newProxyInstance (....) в клиент.

Exemple реализации 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; 
    } 

Я хотел бы вернуться «о» к клиенту, как я могу это сделать?

Каков тип возвращаемого значения метода addResource()? это org.omg.CORBA.Object? или другого типа?

ответ

1

Я не думаю, что вы можете сделать это обычным способом.

из моего понимания, идея CORBA - это определение своего внутреннего представления сообщений, которое является нейтральным платформой (отсюда и кросс-платформенная совместимость). Подумайте, если это позволит вам предоставить произвольный объект Java, если принимающая сторона - это C++, то как он может преобразовать его в представление C++?

Вкратце, вы можете просто использовать структуры, определенные вами в IDL, и если вы действительно хотите вернуть произвольный объект, CORBA, вероятно, не то, что вы хотите. Рассмотрим такие вещи, как RMI.

Если вам действительно нужно это сделать, я считаю, что единственный способ сделать это - сериализация/десериализация самостоятельно и вернуть «объект» в виде последовательности или строки октета. Однако вам необходимо знать, что получатель объекта получил все еще отдельный экземпляр объекта (и, следовательно, его прокси-серверы). Если для работы этих прокси нужны ресурсы серверной части, то я считаю, что вам нужно переосмыслить свой дизайн. Я не думаю, что есть какое-либо решение, которое может магически связать удаленный объект с объектом на стороне сервера таким образом.

+0

Спасибо Adrian Shum, программа работает хорошо, используя вашу идею. Сериализация и десериализация - это решение, отправляя последовательность октетов, которые представляют собой мой java.lang.Object для клиента. –

+0

Честно говоря, хотя это своего рода работа в этом случае, это самое неудобное решение. Я настоятельно рекомендую вам заглянуть в ваш дизайн и не использовать CORBA таким образом. –

+0

Я понял, что сериализация теряет мою распределенную ссылку, которая существует в классе MyInvocationHandler. Когда клиент десериализует прокси-объект и пытается использовать распределенную ссылку, он выдает исключение, потому что он не распознает любого Сервера: S Если вы можете предложить мне некоторые решения. –

-2

Вы должны вернуть тип java.lang.Object, а затем на стороне клиента вы должны вернуть его обратно.

+0

Когда я использовал org.omg.CORBA.Object возвращаемого значения, у меня есть эта ошибка: Исключения в потоке «основной» org.omg.CORBA.UNKNOWN: на стороне сервера Исключение: java.la ng.ClassCastException: com.sun.proxy. $ Proxy0 не может быть передан в org.omg.CORBA.por table.ObjectImpl –

+0

Который объясняет, что я не могу преобразовать java.lang.Object в org.omg.CORBA.Object –

+0

@Ashish Ваш ответ является неоднозначным. Вы имеете в виду 'java.lang.Object' или' org.omg.CORBA.Object'? – EJP