Delphi Datasnap和TObject引用
如何在datasnap服务器中处理对象引用 我有一个Datasnap服务器方法,它返回TUser对象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
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;
融合对象。清晰;
结束;