Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > SOAP, Embarcadero и полиморфизм


Автор: AnTeml 23.10.2014, 11:37
Здравствуйте.

сервер на JAVA (WebLogic 10.3.6)

пишу клиента на Embarcadero XE5

Столкнулся со следующей проблемой. Серверная логика запрограммирована с мыслью о полиморфизме, то есть процедура объявлена как принимающая абстрактный объект-прародитель, а передают в неё конкретные объекты и внутри процедуры, в зависимости от типа переданной переменной, с нею совершаются определённые действия

На практике при передаче объекта-наследника на сервер приходит в реальности объект-прародитель

На всякий случай, попробую привести пример:

Имеется структура классов, унаследованная, пусть для определённости от TAbstractObject и у сервера есть процедура RegisteredAnyObject, принимающая на вход объект любого типа

Родительский класс:
Код

TAbstractObject = class
end;



объявление серверной процедуры:
Код

RegisteredAnyObject(Obj: TAbstractObject);



Пример использования
Код

TConcreteObject = class(TAbstractObject)
  NewField1: integer;
  NewField2: integer;
end;

UsingObject := TConcreteObject.Create;

RegisteredAnyObject(UsingObject);



При таком использовании на сервере в процедуру RegisteredAnyObject приходит объект типа TAbstractObject, соответственно, помимо потери информации о типе при передаче потеряны и поля NewField1, NewField2

Но это ещё не всё. 

Если один из объектов имеет в качестве поля другой объект и ему вместо в это поле подсовывается предок объявленного объекта - на сервере в этом поле точно так же приходит экземпляр не присвоенного присвоенный полю объекта, а его родителя


то есть, на примерах в продолжении предыдущего примера, составной объект:
Код

TComplexObject = class
obj: TAbstractObject
end;


сервис
Код

ServiceForComplexObject(obj: TComplexObject);


использование:
Код

ComplexObject := TComplexObject.Create;
ComplexObject.obj := TConcreteObject.Create

ServiceForComplexObject(ComplexObject);



Результат: на сервер приходит объект типа TComplexObject, в поле obj которого содержится переменная типа TAbstractObject

Для тестирования сервера приложений был написан клиент на Java, содержащий пакет тестов сервисов. Всё превосходно передавалось и принималось. 

Когда начали разработку рабочего клиента на Embarcadero (с использованием HTTPRIO) - получилась такая засада.

Предполагаю, что не указаны какие-то настройки формирования XML-пакета, так же предполагаю, что поддержка полиморфизма - базовый функционал и ну не может быть такого, чтобы в HTTPRIO это не было реализовано.

Но куда копать?

Автор: drkot 14.11.2014, 02:30
Цитата(AnTeml @  23.10.2014,  12:37 Найти цитируемый пост)
Но куда копать?

извините, но для начала в ДНК...
Судя по тексту Вы не имеете представления об Object Pascal как языке и средствах отладки предоставляемых средой разработки.

Цитата(AnTeml @  23.10.2014,  12:37 Найти цитируемый пост)
объявление серверной процедуры:код Pascal/Delphi1:RegisteredAnyObject(Obj: TAbstractObject);

Какой тип объекта вы ожидаете при входе в процедуру?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)