Entwickler-Ecke

Internet / Netzwerk - SOAP - Abgeleitete Klassen- Instanz übermitteln


peeage - Do 08.11.12 13:34
Titel: SOAP - Abgeleitete Klassen- Instanz übermitteln
Hallo zusammen,

ich habe einen Soap- Service, über welchen Commands abgeholt werden.

Hier der Aufbau des Service- Interfaces:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
type
  ISoapSvc = interface( IInvokable )
  ['{44CCD15C-A354-47F0-B9FD-E2BA41FA6B40}']
    function GetCommand : TCommand; stdcall;
  end;

  TCommand = class( TRemotable );

  TCmdHostName = class( TCommand );

implementation

uses
  Soap.InvokeRegistry;

initialization
  InvRegistry.RegisterInterface( TypeInfo(ISoapSvc) );

  RemClassRegistry.RegisterXSClass( TCommand );
  RemClassRegistry.RegisterSerializeOptions( TCommand, [xoLiteralParam] );

  RemClassRegistry.RegisterXSClass( TCmdHostName );
  RemClassRegistry.RegisterSerializeOptions( TCmdHostName, [xoLiteralParam] );


Der Service stellt die Funktion "GetCommand" bereit. Zurückgegeben wird eine Instanz vom Typ "TCommand". Nun kommt es bspw. vor, dass der Command "TCmdHostName" (abgeleitet von TCommand) zurückgegeben wird. Auf der Gegenseite (Client) wird dann aber keine TCmdHostName- Instanz bereitgestellt, sondern eine Instanz der Basisklasse "TCommand".

Ich bin der Meinung, dass ich das Übergeben von abgeleiteten Instanzen vor Jahren schonmal hinbekommen habe.


peeage - Do 08.11.12 23:13

Hat sich erledigt!

Ich hatte für die Klassen TCommand und TCmdHostName als Converter- Option xoLiteralParam gesetzt (z.B.: RemClassRegistry.RegisterSerializeOptions(TCommand, [xoLiteralParam])). Im literalen Dokumentenstil werden Klassen, welche von TRemoteable abgeleiteten Klassen erben, nicht unterstützt.