Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 在重构时,如果我将一个类移动到另一个单元,我的datasnap服务器将无法运行_Json_Delphi_Refactoring_Marshalling_Datasnap - Fatal编程技术网

Json 在重构时,如果我将一个类移动到另一个单元,我的datasnap服务器将无法运行

Json 在重构时,如果我将一个类移动到另一个单元,我的datasnap服务器将无法运行,json,delphi,refactoring,marshalling,datasnap,Json,Delphi,Refactoring,Marshalling,Datasnap,我有一个datasnap服务器,我必须保持运行,或者至少不能更新。 我想用一个新客户连接到它 所有的代码都是相同的,但是我重构了一些代码,所以现在我用来连接到服务器的类在另一个单元中 servermethods是一个返回TMyObject的函数。但实际上,服务器返回类型为Oldunit.TMyObject的封送对象。但客户不承认这一点 function TJSONUnMarshal.CreateObject(JsonObj: TJSONObject): TObject; var objTyp

我有一个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]));
函数tjsonumarshal.CreateObject(JsonObj:TJSONObject):TObject;
变量
对象类型:字符串;
对象:字符串;
objFields:TJSONObject;
对象:对象;
rttType:trtType;
属性:TCustomAttribute;
定制器:TJSONPopulationCustomizer;
JsonPairID:TJSONPair;
JsonPairType:TJSONPair;
JsonPairFields:TJSONPair;
jsonpairefname:TJSONPair;
开始
断言(JsonObj nil);
断言(JsonObj.Count>1);
JsonPairID:=JsonObj.Get(ID\u NAME);
如果JsonPairID为nil,则
开始
JsonPairType:=JsonObj.Get(TYPE\u NAME);
JsonPairFields:=JsonObj.Get(字段名称);
断言(JsonPairFields nil);
断言(JsonPairType nil);
objType:=JsonPairType.JsonValue.Value;
ObjId:=JsonPairID.JsonValue.Value;
objFields:=TJSONObject(JsonPairFields.JsonValue);
Obj:=对象实例(FRTTICtx,objType);//返回nil,objtype错误
如果Obj=nil,则
Create(格式(SCannotCreateType,[objType]);

在我的服务器方法客户端中,我更改了参数的类型。它可以工作,但对我来说更像是一个快速解决方案,我希望我能自动化它。如果我有很多像这样的servermethods,这将是一项乏味的工作,但目前只有一种方法可以在服务器上进行身份验证

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

在我的Servermethodsclient中,我更改了参数的类型。它可以工作,但对我来说更像是一个快速解决方案,我希望我能自动化它。如果我有很多像这样的servermethods,这将是一项乏味的工作,但目前只有一种方法可以在服务器上进行身份验证

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

您是否尝试过将OldUnit.Pas临时重命名为其他名称,删除OldUnit.Dcu,然后重新编译您的客户端?服务器是否可以与重新编译的客户端一起工作?我完全删除了该单元,因为它现在是空的。但它不起作用。您是否尝试过暂时将OldUnit.Pas重命名为其他名称,删除OldUnit.Dcu,然后重新编译您的客户端?服务器是否可以与重新编译的客户端一起工作?我完全删除了该单元,因为它现在是空的。但它不起作用。