Delphi Datasnap和TObject引用

Delphi Datasnap和TObject引用,delphi,delphi-xe2,datasnap,Delphi,Delphi Xe2,Datasnap,如何在datasnap服务器中处理对象引用 我有一个Datasnap服务器方法,它返回TUser对象 TServerMethods.CurrentUser(const AId: Integer): TUser begin Result := GlobalCurrentUser; // <- Don't want to free this object Result.AddReference; end; 当前DataSnap服务器释放了TUser对象,但我想为TreReferenc

如何在datasnap服务器中处理对象引用

我有一个Datasnap服务器方法,它返回TUser对象

TServerMethods.CurrentUser(const AId: Integer): TUser
begin
  Result := GlobalCurrentUser; // <- Don't want to free this object
  Result.AddReference;
end;

当前DataSnap服务器释放了TUser对象,但我想为TreReferenceObject子体调用RemoveReference。

我将DataSnap文件Data.DBXJSONReflect.pas和DataSnap.DSReflect.pas复制到项目目录,添加到项目并进行了三次修改

Data.DBXJSONReflect中的两个更改用于设置正确的ReferenceCount

1) TJSONumarshal.CreateObject

  if HasObject(ObjId) then
  begin
    Obj := GetObject(ObjId);
    if Obj is TReferencedObject then {Framework}
      TReferencedObject(Obj).AddReference; {Framework}    
    exit(Obj);
  end
2) TJSONPopulationCustomiser.PostPopulate

  if Data is TReferencedObject then {Framework}
    TReferencedObject(Data).AddReference; {Framework}
Datasnap.DSReflect中的一个更改是发布引用

1) TDsMethodValues.ClearReferenceParameters

FuseObject.Clear更改为ClearUserObjects(FuseObject)并添加了本地函数

  procedure ClearUserObjects(const AUserObjects: TObjectList<TObject>); {Framework}
  var
    i: Integer;
  begin
    FUserObjects.OwnsObjects := False;
    for i := FUserObjects.Count - 1 downto 0 do
      if FUserObjects.Items[i] is TReferencedObject then
      begin
        TReferencedObject(FUserObjects.Items[i]).RemoveReference;
        FUserObjects.Delete(i);
      end;
    FUserObjects.OwnsObjects := True;
    FUserObjects.Clear;
  end;
过程ClearUserObjects(const auserObject:TObjectList);{Framework}
变量
i:整数;
开始
FUserObjects.OwnsObjects:=False;
对于i:=FUserObjects.Count-1到0
如果FUserObjects.Items[i]是TreeferencedObject,则
开始
t参考对象(FuserObject.Items[i])。移除参考;
FuserObject.删除(i);
结束;
FUserObjects.OwnsObjects:=True;
融合对象。清晰;
结束;

我将DataSnap文件Data.DBXJSONReflect.pas和DataSnap.DSReflect.pas复制到项目目录,添加到项目中,并进行了三次修改

Data.DBXJSONReflect中的两个更改用于设置正确的ReferenceCount

1) TJSONumarshal.CreateObject

  if HasObject(ObjId) then
  begin
    Obj := GetObject(ObjId);
    if Obj is TReferencedObject then {Framework}
      TReferencedObject(Obj).AddReference; {Framework}    
    exit(Obj);
  end
2) TJSONPopulationCustomiser.PostPopulate

  if Data is TReferencedObject then {Framework}
    TReferencedObject(Data).AddReference; {Framework}
Datasnap.DSReflect中的一个更改是发布引用

1) TDsMethodValues.ClearReferenceParameters

FuseObject.Clear更改为ClearUserObjects(FuseObject)并添加了本地函数

  procedure ClearUserObjects(const AUserObjects: TObjectList<TObject>); {Framework}
  var
    i: Integer;
  begin
    FUserObjects.OwnsObjects := False;
    for i := FUserObjects.Count - 1 downto 0 do
      if FUserObjects.Items[i] is TReferencedObject then
      begin
        TReferencedObject(FUserObjects.Items[i]).RemoveReference;
        FUserObjects.Delete(i);
      end;
    FUserObjects.OwnsObjects := True;
    FUserObjects.Clear;
  end;
过程ClearUserObjects(const auserObject:TObjectList);{Framework}
变量
i:整数;
开始
FUserObjects.OwnsObjects:=False;
对于i:=FUserObjects.Count-1到0
如果FUserObjects.Items[i]是TreeferencedObject,则
开始
t参考对象(FuserObject.Items[i])。移除参考;
FuserObject.删除(i);
结束;
FUserObjects.OwnsObjects:=True;
融合对象。清晰;
结束;