Json 在重构时,如果我将一个类移动到另一个单元,我的datasnap服务器将无法运行
我有一个datasnap服务器,我必须保持运行,或者至少不能更新。 我想用一个新客户连接到它 所有的代码都是相同的,但是我重构了一些代码,所以现在我用来连接到服务器的类在另一个单元中 servermethods是一个返回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
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,然后重新编译您的客户端?服务器是否可以与重新编译的客户端一起工作?我完全删除了该单元,因为它现在是空的。但它不起作用。