如何处理datasnap服务器中的对象引用?
我有返回TUser对象的Datasnap服务器方法
TServerMethods.CurrentUser(const AId: Integer): TUser
begin
Result := GlobalCurrentUser; // <- Don't want to free this object
Result.AddReference;
end;TReferencedObject的子类中的TUser
TReferencedObject = class(TObject)
private
FReferenceCnt: integer;
public
procedure AddReference; virtual;
procedure RemoveReference; virtual; // Frees object if reference count goes to 0
property ReferenceCnt: integer Read FReferenceCnt Write FReferenceCnt;
end;目前,DataSnap服务器释放了TUser对象,但我想为TReferencedObject后代调用RemoveReference。
发布于 2012-05-21 20:35:52
我将DataSnap文件Data.DBXJSONReflect.pas和Datasnap.DSReflect.pas复制到项目目录中,添加到项目中,并做了三处修改。
设置正确ReferenceCount的Data.DBXJSONReflect中的两个更改
1) TJSONUnMarshal.CreateObject
if HasObject(ObjId) then
begin
Obj := GetObject(ObjId);
if Obj is TReferencedObject then {Framework}
TReferencedObject(Obj).AddReference; {Framework}
exit(Obj);
end2) TJSONPopulationCustomiser.PostPopulate
if Data is TReferencedObject then {Framework}
TReferencedObject(Data).AddReference; {Framework}Datasnap.DSReflect发布参考中的一处更改
1) TDsMethodValues.ClearReferenceParameters
将FUserObject.Clear更改为ClearUserObjects(FUserObjects);,并添加本地函数
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;https://stackoverflow.com/questions/10615193
复制相似问题