2016-05-24 21 views
1

Ich habe einen DataSnap-Server, den ich weiter laufen oder zumindest nicht aktualisieren kann. Ich möchte mit einem neuen Client verbinden.Beim Refactoring kann mein Datennap-Server nicht marshallen, wenn ich eine Klasse auf eine andere Einheit verschoben habe

Der gesamte Code ist der gleiche, aber ich habe etwas Code überarbeitet, so dass jetzt eine Klasse, die ich benutze, um eine Verbindung zum Server herzustellen, in einer anderen Einheit ist.

Die Servermethoden ist eine Funktion, die TMyObject zurückgibt. In Wirklichkeit gibt der Server jedoch ein Marshalled-Objekt vom Typ Oldunit.TMyObject zurück. Dies wird jedoch vom Kunden nicht erkannt.

function TJSONUnMarshal.CreateObject(JsonObj: TJSONObject): TObject; 
var 
    objType: string; 
    ObjId: string; 
    objFields: TJSONObject; 
    Obj: TObject; 
    rttiType : TRttiType; 
    attr : TCustomAttribute; 
    customizer : TJSONPopulationCustomizer; 
    JsonPairID: TJSONPair; 
    JsonPairType: TJSONPair; 
    JsonPairFields: TJSONPair; 
    JsonPairRefName: TJSONPair; 
begin 
    assert(JsonObj <> nil); 
    assert(JsonObj.Count > 1); 
    JsonPairID := JsonObj.Get(ID_NAME); 
    if JsonPairID <> nil then 
    begin 
    JsonPairType := JsonObj.Get(TYPE_NAME); 
    JsonPairFields := JsonObj.Get(FIELDS_NAME); 
    Assert(JsonPairFields <> nil); 
    Assert(JsonPairType <> nil); 
    objType := JsonPairType.JsonValue.Value; 

    ObjId := JsonPairID.JsonValue.Value; 

    objFields := TJSONObject(JsonPairFields.JsonValue); 

    Obj := ObjectInstance(FRTTICtx, objType); // returns nil, objtype is wrong 
    if Obj = nil then 
     raise EConversionError.Create(Format(SCannotCreateType, [objType])); 
+0

Haben Sie versucht, OldUnit.Pas vorübergehend in etwas anderes umzubenennen, OldUnit.Dcu zu löschen und dann Ihren Client neu zu kompilieren? Arbeitet der Server dann mit dem neu kompilierten Client? – MartynA

+0

Ich habe das Gerät komplett entfernt, weil es jetzt leer war. Und es hat nicht funktioniert. –

Antwort

0

In meinem Servermethodsclient habe ich den Typ meines Parameters geändert. Es funktioniert, aber es sieht eher wie eine schnelle Lösung für mich aus und ich wünschte, ich könnte es automatisieren. Wenn ich so viele Servermethoden hätte, wäre das mühsame Arbeit, aber im Moment ist es nur eine Methode, um sich auf einem Server zu authentifizieren.

pJSON := TJSONObject(FPW_GetServerInfoCommand.Parameters[2].Value.GetJSONValue(True));  
    pPair := pJSON.RemovePair('type'); 
    pPair.Free; 
    pJSON.AddPair(TJSONPair.Create('type', 'NewUnit.TMyObject'));  

    Result := TMyObject(FUnMarshal.UnMarshal(FPW_GetServerInfoCommand.Parameters[2].Value.GetJSONValue(True)));