当重构我的datasnap服务器时,如果我将一个类移动到另一个单元,则无法编组

时间:2016-05-24 11:30:09

标签: json delphi refactoring marshalling datasnap

我有一个datasnap服务器,我必须继续运行或至少无法更新。 我想用新客户端连接到它。

所有代码都是相同的,但我重构了一些代码,所以现在我用来连接服务器的类在另一个单元中。

servermethods是一个返回TMyObject的函数。但实际上,服务器返回类型为Oldunit.TMyObject的编组对象。但客户不承认这一点。

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]));

1 个答案:

答案 0 :(得分:0)

在My Servermethodsclient中,我更改了我的参数类型。它的工作原理,但它看起来更像是一个快速修复我,我希望我可以自动化它。如果我有很多像这样的服务器方法,这将是一项繁琐的工作,但是现在只有一种方法可以在服务器上进行身份验证。

   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)));